Swift. Строки. Графем-кластер
Назад · Оглавление · Дальше
Кодовая точка
String - коллекция, каждый элемент которой представлен индексом и значением типа Character.
Для описания символа можно использовать юникод-скаляр:
var char1: Character = "\u{E9}" // E9 - кодовая точка char1 // "é"
Данный символ можно описать иначе:
var char2: Character = "\u{65}\u{301}" // два юникод-скаляра и две кодовые точки char2 // "é"
Не смотря на разное количество кодовых точек, обе переменные хранят символ "é":
char1 == char2 // true
В переменной char2 хранится комбинированный символ, состоящий из двух кодовых точек:
\u{65} - латинская буква e \u{301} - модифицирующий символ "знак ударения"
Графем-кластер
Графем-кластер - совокупность юникод-скаляров (кодовых точек), формирующих один символ.
Графем-кластер может состоять из одного или двух юникод-скаляров.
Графем-кластер описывает значение параметров Character, например, эмодзи:
var thumbsUp = "\u{1f44d}" // Thumbs up sign (палец вверх) var blackSkin = "\u{1f3fd}" // Emoji Modifier Fitzpatrick Type-4 (цвет кожи) var combine = "\u{1f44d}\u{1f3fd}" // палец вверх со средиземноморским цветом кожи
Каждый символ имеет кодовую точку и уникальное название:
1f44d - "Thumbs up sign"
Модифицирующий символ в строке:
let a = "caf\u{E9}" // "café" é - \u{E9} let b = "cafe\u{301}" // "café" é - e + \u{301} a.count // 4 b.count // 4
В переменной b пять символов, но b.count возвращает четыре.
Причина в том, что строка - это коллекция графем-кластеров, а не символов.
Время подсчета количества символов в строке, растет линейно с увеличением количества символов.
Для вычисления всех графем-кластеров (один или два юникод-скаляра) необходимо пройти всю коллекцию.
Использование графем-кластеров - причина отсутствия доступа к символу через целочисленный индекс.
Вместо основного символа, индекс может указать на модифицирующий символ в составе графем-кластера.
Для доступа к элементу строки, необходимо пройти все элементы слева от него,
только так можно получить корректный графем-кластер.
Тем не менее, строка - это упорядоченная коллекция, каждый элемент которой имеет значение Character и индекс, указывающий положение элемента в коллекции.
Назад · Оглавление · Дальше