Vous n'êtes pas le seul à ne pas avoir trouvé la solution.
String
ne met pas en œuvre RandomAccessIndex
. Probablement parce qu'ils permettent des caractères avec des longueurs d'octets différentes. C'est pourquoi nous devons utiliser countElements
pour obtenir le nombre de caractères. Cela s'applique également aux positions. Le site _position
est probablement un index dans le tableau brut d'octets et ils ne veulent pas l'exposer. Le site String.Index
est censé nous protéger contre l'accès aux octets au milieu des caractères.
Cela signifie que tout index que vous obtenez doit être créé à partir de String.startIndex
ou String.endIndex
( String
met en œuvre BidirectionalIndex
). Tout autre indice peut être créé en utilisant succ
ou pred
méthodes.
Pour nous aider avec les indices, il existe un ensemble de fonctions :
let text = "abc"
let index2 = advance(text.startIndex, 2) //will call succ 2 times (facepalm)
let lastChar: Character = text[index2] //now we can index!
let range = text.rangeOfString("b")
var index: Int = distance(text.startIndex, range.startIndex) //will call succ/pred several times (facepalm)
Je suis sérieusement préoccupé par la performance des cordes. De plus, travailler avec String.Index
est encombrant.
Notez que cette mise en œuvre présente le problème suivant : les plages créées pour une chaîne de caractères ne peuvent pas être utilisées de manière fiable pour une autre chaîne de caractères, par exemple :
var text: String = "abc"
var text2: String = "
0 votes
Voici un projet GitHub qui contient de nombreuses méthodes d'extension pour la manipulation des chaînes de caractères Swift : github.com/iamjono/SwiftString
0 votes
La meilleure mise en œuvre que j'ai trouvée est ici : stackoverflow.com/a/32306142/4550651
0 votes
Vous devez faire la distinction entre les points de code Unicode et les groupes de graphèmes étendus ?