Посимвольная работа со строками
Как и другие современные языки, Swift работает со строками в Юникоде, поэтому соответствие один символ — один байт не всегда верно.
import Foundation
var string = "Hello"
print(string.characters.count)
// Output: 5
print(string.utf8.count)
// Output: 5
string = "H?llo"
print(string.characters.count)
// Output: 5
print(string.utf8.count)
// Output: 6
Чтобы получить список именно символов, а не отдельных скаляров, есть свойство characters (типа String.CharacterView). Кроме прочих возможностей, оно поддерживает посимвольные циклы for-in и индексное обращение через [].
Особенностью является специальный тип индексов — String.CharacterView.Index (он же String.Index). Причем сами значения индексов задаются не абсолютно, а вычисляются относительно позиционных маркеров в начале и конце строки путем сдвига от них на нужное количество символов.
import Foundation
var string = "Hello"
for character in string.characters {
print(character)
}
/*
Output:
H
e
l
l
o
*/
print(string.characters[0])
// Output: Cannot subscript a value of type 'String.CharacterView' with an index of type 'Int'
print(string.characters[string.startIndex])
// Output: H
string.replaceRange(string.startIndex.successor()...string.endIndex.advancedBy(-4), with: "a")
print(string)
// Output: Hallo