String
и Character
в Swift полностью Юникод-совместимы.
String
построен из значений Юникод-скаляров. Юникод-скаляр - это уникальное 21-битовое число для символа или модификатора, например, U+0061 для LATIN SMALL LETTER A ("a") или U+1F425 для FRONT-FACING BABY CHICK ("🐥").
let wiseWords = "\"Воображение важнее знания\" - Энштейн" // "оображение важнее знания" - Энштейн
let dollarSign = "\u{24}" // $, Юникод-скаляр U+0024
let blackHeart = "\u{2665}" // ♥, Юникод-скаляр U+2665
let sparklingHeart = "\u{1F496}" // 💖, Юникод-скаляр U+1F496
Код демонстрирует четыре примера этих специальных символов. Константа wiseWords
содержит две экранированные двойные кавычки. Константы dollarSign
, blackHeart
и sparklingHeart
демонстрируют формат Юникод-скаляров.
Character
репрезентует отдельный расширенный графем-кластер. Графем-класьер - это последовательность из одного или нескольких Юникод-скаляров, которые (после соединения) образуют единый человекочитаемый символ.
let eAcute: Character = "\u{E9}" // é
let combinedEAcute: Character = "\u{65}\u{301}" // e с последующим ́
// eAcute равен é, combinedEAcute равен é
Вот пример. Буква é может быть представлена в качестве одного Юникод-скаляра é (LATIN SMALL LETTER E WITH ACUTE или U+00E9). Однако эта же самая буква может быть представлена в качестве пары скаляров - обычная буква e (LATIN SMALL LETTER E или U+0065), которая сопровождается COMBINING ACUTE ACCENT скаляром (U+0301). COMBINING ACUTE ACCENT скаляр применяется графически к предшествующему ему скаляру, превращая e в é, когда происходит рендеринг системой Юникода.
Character
типа Swift, что представляется с помощью расширенного графем-кластера. В первом случае кластера содержит единственный скаляр, а во втором - кластер состоит из двух скаляров.
Character
. Например, Hangul
звуки из Корейского алфавита могут быть представлены в качестве заранее заданных или разложенных последовательностей. Оба этих представления будут считаться одним значением типа Character
в Swift.
let precomposed: Character = "\u{D55C}"
let decomposed: Character = "\u{1112}\u{1161}\u{11AB}"
//precomposed равен "한", decomposed равен "한"
Character
.
let enclosedEAcute: Character = "\u{E9}\u{20DD}"
// enclosedEAcute равен é⃝
Character
, как например комбинация REGIONAL SYMBOL LETTER R (U+1F1F7) и REGIONAL INDICATOR LETTER U (U+1F1FA).
let regionalIndicatorForRussia: Character = "\u{1F1F7}\u{1F1FA}"
// regionalIndicatorForRussia равен 🇷🇺
count
строки:
let unusualMenagerie = "Коала 🐨, Улитка 🐌, Пингвин 🐧, Верблюд 🐫"
print("unusualMenagerie имеет \(unusualMenagerie.characters.count) символов")
// Напечатает "unusualMenagerie имеет 40 символов"
Character
подразумевает, что строковая конкатенация или модификация не всегда может изменить количество символов в строке.
var word = "cafe"
print("количество символов в \(word) равно \(word.characters.count)")
// Выведет "количество символов в cafe равно 4"
word += "\u{301}" // COMBINING ACUTE ACCENT, U+0301
print("количество символов в \(word) равно \(word.characters.count)")
// Выведет "количество символов в café равно 4"
Например, если Вы зададите новую строку с помощью четырёхсимволоного слова cafe
, а затем прибавите COMBINING ACUTE ACCENT (U+0301) в конец строки, то результирующая строка будет иметь количество символов, равное 4, причём четвёртым символом будет é, а не e.
count
, не всегда одинаково со свойством length
типа NSString
, даже если она содержит те же символы. Длина NSString
основана на количестве 16-битных кодов символов в UTF-16 представлении строки, а не на количестве расширенных графем-кластеров в строке.