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?é
. Il est en fait composé due
plus une\u{301}
représentation Unicode. Si vous utilisez un index de zéro, vous obtiendrez soit le caractèree
accentué ("grave"), et non le cluster entier qui compose leé
. L'utilisation destartIndex
garantit que vous obtiendrez le cluster de graphèmes complet pour n'importe quel caractère.String.Index
partir d'un entier, autre que de construire une chaîne factice et d'utiliser la.index
méthode dessus? Je ne sais pas si je manque quelque chose, mais la documentation ne dit rien.String.Index
avec un entier car chaque SwiftCharacter
n'équivaut pas nécessairement à la même chose que vous entendez avec un entier. Cela dit, vous pouvez passer un entier dans leoffsetBy
paramètre pour créer un fichierString.Index
.String
Cependant, si vous n'avez pas de a , vous ne pouvez pas construire deString.Index
(car Swift ne peut calculer l'index que s'il sait quels sont les caractères précédents de la chaîne). Si vous modifiez la chaîne, vous devez recalculer l'index. Vous ne pouvez pas utiliser la même choseString.Index
sur deux chaînes différentes.la source
Créez un UITextView à l'intérieur d'un tableViewController. J'ai utilisé la fonction: textViewDidChange, puis j'ai vérifié l'entrée clé de retour. puis s'il a détecté une entrée par touche de retour, supprimez l'entrée de la touche de retour et fermez le clavier.
la source