Как выполнить итерацию по строке в Swift?

Ответ

Да, строка (String) в Swift является коллекцией символов (Character), поэтому по ней можно итерироваться.

Основные способы:

  1. Прямая итерация по символам:

    let greeting = "Привет, мир!"
    for character in greeting {
    print(character) // Каждый Character (графем-кластер)
    }
  2. С использованием индексов (рекомендуется для модификации):

    for index in greeting.indices {
    print(greeting[index]) // Безопасный доступ по индексу
    }
  3. С получением индексов через enumerated():

    for (offset, character) in greeting.enumerated() {
    print("Позиция (offset): (character)")
    }

Ключевые особенности строк в Swift:

  • Строки работают с Unicode, поэтому один Character может состоять из нескольких Unicode скаляров
  • Не используйте целочисленные индексы — это вызовет ошибку компиляции
  • Для доступа по позиции используйте String.Index:
    let firstIndex = greeting.startIndex
    let fifthIndex = greeting.index(firstIndex, offsetBy: 4)
    print(greeting[fifthIndex]) // "т"
  • Для производительности при многократном доступе конвертируйте строку в массив: Array(greeting)

Ответ 18+ 🔞

А, ну вот, опять про эти ваши строки в Swift. Слушай, тут народ частенько, блядь, путается, потому что привык к старым добрым массивам байтиков. А тут, сука, целая философия!

Так вот, строка в Swift — это, по сути, коллекция этих самых Character. То есть можешь по ней итерироваться, как по обычному массиву, только с подвохом, ёпта.

Как это обычно делают, чтобы не облажаться:

  1. Просто тупо пройтись по символам, как бог на душу положит:

    let greeting = "Привет, мир!"
    for character in greeting {
    print(character) // Каждый Character (графем-кластер)
    }

    Всё, блядь, элементарно. Цикл for-in съедает строку и выдаёт тебе символы по одному. Никакой магии.

  2. Если тебе ещё и позиция нужна (ну, мало ли, захочешь что-то поменять или просто поумничать):

    for index in greeting.indices {
    print(greeting[index]) // Безопасный доступ по индексу
    }

    Вот это уже правильный путь, блядь. Не лезь со своими [5] — получишь по ебалу от компилятора. Только String.Index, только хардкор.

  3. А если прям позарез нужен номер позиции, как в старые добрые времена:

    for (offset, character) in greeting.enumerated() {
    print("Позиция (offset): (character)")
    }

    enumerated() — твой друг, он даст и символ, и его порядковый номер (offset). Но помни, ёпта, этот offset — не индекс для доступа к строке! Это просто счётчик итераций.

А теперь, блядь, самое важное, где все и обоссываются:

Строки в Swift — они с Unicode дружат. Один Character — это не один байт, и даже не всегда один скаляр. Это может быть целая ёбаная графем-кластер из кучи диакритических знаков, как этот ваш "é" (e + acute accent). Поэтому:

  • Забудь, блядь, про целочисленные индексы нахуй. greeting[5] — это ошибка компиляции, тебе сразу скажут "иди нахуй".

  • Хочешь получить символ по позиции? Извращайся вот так:

    let firstIndex = greeting.startIndex // Начало, логично же
    let fifthIndex = greeting.index(firstIndex, offsetBy: 4) // Сдвигаемся на 4 позиции ВПЕРЁД
    print(greeting[fifthIndex]) // "т"

    Да, неудобно, блядь. Зато правильно и не сломается на эмодзи или каких-нибудь там вьетнамских буквах.

  • И главный лайфхак, если тебе надо часто лазить по строке туда-сюда, как угорелому: Конвертируй её в массив один раз и работай с массивом.

    let charactersArray = Array(greeting)
    print(charactersArray[5]) // Вот теперь можно и по целому индексу!

    Производительность, блядь, будет в разы выше, потому что не надо каждый раз эти индексы высчитывать. Но массив займёт больше памяти. Выбирай, что тебе дороже: скорость или место.

Вот и вся, блядь, наука. Не усложняй, и всё будет пучком.