Tutti i seguenti esempi usano
var str = "Hello, playground"
startIndex
e endIndex
startIndex
è l'indice del primo carattere
endIndex
è l'indice dopo l'ultimo carattere.
Esempio
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Con le gamme unilaterali di Swift 4 , la gamma può essere semplificata in una delle seguenti forme.
let range = str.startIndex...
let range = ..<str.endIndex
Userò il modulo completo nei seguenti esempi per motivi di chiarezza, ma per motivi di leggibilità, probabilmente vorrai usare gli intervalli unilaterali nel tuo codice.
after
Come in: index(after: String.Index)
after
si riferisce all'indice del carattere subito dopo l'indice dato.
Esempi
// 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
Come in: index(before: String.Index)
before
si riferisce all'indice del carattere direttamente prima dell'indice dato.
Esempi
// 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
Come in: index(String.Index, offsetBy: String.IndexDistance)
- Il
offsetBy
valore può essere positivo o negativo e parte dall'indice dato. Sebbene sia del tipo String.IndexDistance
, puoi dargli unInt
.
Esempi
// 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
Come in: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Il
limitedBy
è utile per fare in modo che l'offset non causa l'indice di andare fuori dai limiti. È un indice di delimitazione. Poiché è possibile che l'offset superi il limite, questo metodo restituisce un optional. Restituisce nil
se l'indice è fuori dai limiti.
Esempio
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Se l'offset fosse stato 77
invece di 7
, l' if
istruzione sarebbe stata ignorata.
Perché è necessario String.Index?
Sarebbe molto più facile usare un fileInt
indice per le stringhe. Il motivo per cui devi creare un nuovo String.Index
per ogni stringa è che i personaggi in Swift non hanno tutti la stessa lunghezza sotto il cofano. Un singolo Swift Character potrebbe essere composto da uno, due o anche più punti di codice Unicode. Quindi ogni stringa univoca deve calcolare gli indici dei suoi caratteri.
È possibile nascondere questa complessità dietro un'estensione dell'indice Int, ma sono riluttante a farlo. È bene ricordare ciò che sta realmente accadendo.
startIndex
essere qualcosa di diverso da 0?