Tous les exemples suivants utilisent
var str = "Hello, playground"
startIndex
et endIndex
startIndex
est l'index du premier caractère
endIndex
est l'index 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 les gammes unilatérales de Swift 4 , la gamme peut être simplifiée à l'une des formes suivantes.
let range = str.startIndex...
let range = ..<str.endIndex
J'utiliserai le formulaire complet dans les exemples suivants pour plus de clarté, mais pour des raisons de lisibilité, vous voudrez probablement utiliser les plages unilatérales dans votre code.
after
Un péché: index(after: String.Index)
after
fait référence à l'index du caractère directement après l'index 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
Un péché: index(before: String.Index)
before
fait référence à l'index du caractère juste avant l'index 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
Un péché: index(String.Index, offsetBy: String.IndexDistance)
- La
offsetBy
valeur peut être positive ou négative et commence à partir de l'index donné. Bien qu'il soit du type String.IndexDistance
, vous pouvez lui donner un fichier 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
Un péché: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Le
limitedBy
est utile pour s'assurer que le décalage ne fait pas sortir l'index des limites. C'est un index englobant. Puisqu'il est possible que le décalage dépasse la limite, cette méthode retourne une option. Il retourne 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
, l' if
instruction aurait été ignorée.
Pourquoi String.Index est-il nécessaire?
Il serait beaucoup plus facile d'utiliser un Int
index pour les chaînes. La raison pour laquelle vous devez créer un nouveau String.Index
pour chaque chaîne est que les caractères dans Swift ne sont pas tous de la même longueur sous le capot. Un seul caractère Swift peut être composé d'un, deux ou même plusieurs points de code Unicode. Ainsi, chaque chaîne unique doit calculer les index de ses caractères.
C'est peut-être pour cacher cette complexité derrière une extension d'index Int, mais je suis réticent à le faire. Il est bon de se rappeler ce qui se passe réellement.
startIndex
autre chose que 0?