Как перебирать символы строки (String) в цикле в Swift?

«Как перебирать символы строки (String) в цикле в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Тип String в Swift соответствует протоколу Collection, поэтому его можно итерировать в цикле for-in, получая на каждой итерации объект типа Character.

Базовый пример:

let message = "Hello"
for character in message {
    print(character) // Выведет: H, e, l, l, o (каждый на новой строке)
}

Важные особенности и лучшие практики:

  1. Unicode-корректность: Character представляет собой расширенный кластер графемы (extended grapheme cluster). Это значит, что один «символ» может состоять из нескольких скаляров Unicode (например, эмодзи "👨‍👩‍👧‍👦" или буква с акцентом "é"). Цикл обрабатывает это корректно.
  2. Доступ по индексу: Для прямого доступа по индексу используйте специфичные для строки индексы (String.Index), а не целые числа.
    let str = "Swift"
    let firstChar = str[str.startIndex] // 'S'
    let thirdIndex = str.index(str.startIndex, offsetBy: 2)
    let thirdChar = str[thirdIndex] // 'i'
  3. Получение числового индекса: Используйте метод enumerated().
    for (index, character) in "Swift".enumerated() {
        print("Index (index): (character)")
    }
    // Output:
    // Index 0: S
    // Index 1: w
    // Index 2: i
    // Index 3: f
    // Index 4: t
  4. Преобразование в массив: Для многократного индексирования иногда эффективно преобразовать строку в массив символов.
    let charactersArray = Array("Hello") // Тип [Character]