Ответ
Да, строка (String) в Swift является коллекцией символов (Character), поэтому по ней можно итерироваться.
Основные способы:
-
Прямая итерация по символам:
let greeting = "Привет, мир!" for character in greeting { print(character) // Каждый Character (графем-кластер) } -
С использованием индексов (рекомендуется для модификации):
for index in greeting.indices { print(greeting[index]) // Безопасный доступ по индексу } -
С получением индексов через
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. То есть можешь по ней итерироваться, как по обычному массиву, только с подвохом, ёпта.
Как это обычно делают, чтобы не облажаться:
-
Просто тупо пройтись по символам, как бог на душу положит:
let greeting = "Привет, мир!" for character in greeting { print(character) // Каждый Character (графем-кластер) }Всё, блядь, элементарно. Цикл
for-inсъедает строку и выдаёт тебе символы по одному. Никакой магии. -
Если тебе ещё и позиция нужна (ну, мало ли, захочешь что-то поменять или просто поумничать):
for index in greeting.indices { print(greeting[index]) // Безопасный доступ по индексу }Вот это уже правильный путь, блядь. Не лезь со своими
[5]— получишь по ебалу от компилятора. ТолькоString.Index, только хардкор. -
А если прям позарез нужен номер позиции, как в старые добрые времена:
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]) // Вот теперь можно и по целому индексу!Производительность, блядь, будет в разы выше, потому что не надо каждый раз эти индексы высчитывать. Но массив займёт больше памяти. Выбирай, что тебе дороже: скорость или место.
Вот и вся, блядь, наука. Не усложняй, и всё будет пучком.