Aggiornamento per Swift 4 (Xcode 9)
Come di Swift 4 (testato con Xcode 9 beta) un "Emoji ZWJ Sequence" è trattata come un singolo Character
come richiesto dallo standard Unicode 9:
let str = ""
print(str.count) // 2
print(Array(str)) // ["", ""]
anche String
è una raccolta dei suoi caratteri (nuovo), così possiamo chiamata str.count
per ottenere la lunghezza, e Array(str)
ottenere tutti caratteri come un array.
(risposta vecchio per Swift 3 e precedenti)
Questa è solo una risposta parziale che può aiutare in questo caso particolare.
"" è infatti una combinazione di quattro caratteri separati:
let str = "" //
print(Array(str.characters))
// Output: ["", "", "", "", ""]
che vengono incollati con U + 200D (ZERO WIDTH JOINER):
for c in str.unicodeScalars {
print(String(c.value, radix: 16))
}
/* Output:
1f468
200d
1f468
200d
1f467
200d
1f467
1f60d
*/
enumerazione la stringa con il .ByComposedCharacterSequences
Le opzioni combina correttamente questi caratteri:
Ma ci sono altri casi in cui questo non funziona, ad es. le "bandiere" che sono una sequenza di "Indicatore regionale caratteri" (confronta Swift countElements() return incorrect value when count flag emoji). Con
let str = ""
il risultato del ciclo precedente è
["", ""]
che non è il risultato desiderato.
Le regole complete sono definiti in "3 Grapheme Cluster Boundaries" in "Standard allegato # 29 Testo Unicode segmentazione" nello standard Unicode .
Ciao Martin. Prima di tutto molte grazie per la risposta. Come hai detto, ci sono casi in cui questo non funzionerà, ma ho provato il tuo codice e funziona bene. ecco la mia stringa completa con molti flag [""] che sono stati separati in ["", "", "", "", ""]. Un'altra cosa stavo cercando di risolvere questo da ieri in poi, ma non sono riuscito a farcela. Puoi dirmi come impari quelle cose e quale documentazione preferirei? – KiranJasvanee
Ho anche provato questa logica con le bandiere, e ha funzionato bene per un paio di bandiere diverse. –
@KiranJasvanee: Il "problema" è stato risolto in Swift 4 (attualmente beta). –