Aktualizacja Swift 4 (Xcode 9)
Jako Swift 4 (test z Xcode 9 beta) w "Emoji ZWJ sekwencji" traktowane jako pojedynczy Character
zgodnie z zaleceniami normy Unicode 9:
let str = ""
print(str.count) // 2
print(Array(str)) // ["", ""]
także String
jest zbiorem jego znaków (znowu), więc możemy wezwanie str.count
aby uzyskać długość i Array(str)
uzyskać wszystkie znaków jako tablicę.
(Old odpowiedź na Swift 3 i wcześniej)
Jest to tylko częściowa odpowiedź, która może pomóc w tym konkretnym przypadku.
"" jest w rzeczywistości połączenie z czterech oddzielnych postaci:
let str = "" //
print(Array(str.characters))
// Output: ["", "", "", "", ""]
, które są sklejone z U + 200D (zerowej szerokości JOINER)
for c in str.unicodeScalars {
print(String(c.value, radix: 16))
}
/* Output:
1f468
200d
1f468
200d
1f467
200d
1f467
1f60d
*/
Wyliczanie ciąg z .ByComposedCharacterSequences
opcje poprawnie łączą te znaki:
var chars : [String] = []
str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) {
(substring, _, _, _) ->() in
chars.append(substring!)
}
print(chars)
// Output: ["", ""]
Są jednak inne przypadki, w których to nie działa, np. "flagi" będące ciągiem znaków "Regional Indicator " (porównaj Swift countElements() return incorrect value when count flag emoji). Z
let str = ""
wynikiem wyżej pętli
["", ""]
, który nie jest pożądany rezultat.
Pełne zasady są określone w "3 Grapheme Cluster Boundaries" w „Standard załącznik nr 29 UNICODE TEKSTU SEGMENTACJI” w standardzie Unicode.
Witam Martinie. Przede wszystkim wielkie dzięki za odpowiedź. Jak już powiedziałeś, są przypadki, w których to nie zadziała, ale spróbowałem twojego kodu i działa dobrze. tutaj jest mój pełny ciąg z wieloma flagami [""], które zostały rozdzielone na ["", "", "", "", ""]. Jeszcze jedno próbowałem rozwiązać to od wczoraj, ale nie byłem w stanie tego zrobić. Czy możesz mi powiedzieć, jak się uczysz tych rzeczy i jaką dokumentację powinienem wybrać? – KiranJasvanee
Próbowałem również tej logiki z flagami i działało dobrze dla kilku różnych flag. –
@KiranJasvanee: "Problem" został naprawiony w Swift 4 (obecnie wersja beta). –