Tous les exemples suivants utilisent
var str = "Hello, playground"
startIndex
y endIndex
-
startIndex
est l'indice du premier caractère
-
endIndex
est l'indice après le dernier caractère.
Exemple
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Avec le système Swift 4 plages unilatérales la gamme peut être simplifiée sous l'une des formes suivantes.
let range = str.startIndex...
let range = ..<str.endIndex
J'utiliserai la forme complète dans les exemples suivants pour des raisons de clarté, mais pour plus de lisibilité, vous voudrez probablement utiliser les plages unilatérales dans votre code.
after
Comme dans : index(after: String.Index)
-
after
fait référence à l'indice du caractère qui suit directement l'indice donné.
Exemples
// character
let index = str.index(after: str.startIndex)
str[index] // "e"
// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range] // "ello, playground"
before
Comme dans : index(before: String.Index)
-
before
fait référence à l'indice du caractère qui précède directement l'indice donné.
Exemples
// character
let index = str.index(before: str.endIndex)
str[index] // d
// range
let range = str.startIndex..<str.index(before: str.endIndex)
str[range] // Hello, playgroun
offsetBy
Comme dans : index(String.Index, offsetBy: String.IndexDistance)
- El
offsetBy
peut être positive ou négative et commence à partir de l'indice donné. Bien qu'il soit du type String.IndexDistance
vous pouvez lui donner un Int
.
Exemples
// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p
// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
str[range] // play
limitedBy
Comme dans : index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- El
limitedBy
est utile pour s'assurer que l'offset ne fait pas sortir l'index de ses limites. Il s'agit d'un indice limitatif. Comme il est possible que l'offset dépasse la limite, cette méthode renvoie un Optional. Elle renvoie nil
si l'index est hors limites.
Exemple
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Si le décalage avait été 77
au lieu de 7
alors le if
aurait été ignorée.
Pourquoi String.Index est-il nécessaire ?
Ce serait beaucoup plus facile d'utiliser un Int
pour les chaînes de caractères. La raison pour laquelle vous devez créer un nouvel String.Index
pour chaque chaîne est que les caractères en Swift n'ont pas tous la même longueur. Un seul caractère Swift peut être composé d'un, de deux, voire de plusieurs points de code Unicode. Ainsi, chaque chaîne unique doit calculer les indices de ses caractères.
Il est possible de cacher cette complexité derrière une extension de l'indice Int, mais je suis réticent à le faire. Il est bon de se faire rappeler ce qui se passe réellement.