Посимвольная работа со строками

Как и другие современные языки, 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