
Alle folgenden Beispiele verwenden
var str = "Hello, playground"
startIndex und endIndex
startIndex ist der Index des ersten Zeichens
endIndexist der Index nach dem letzten Zeichen.
Beispiel
// character
str[str.startIndex] // H
str[str.endIndex] // error: after last character
// range
let range = str.startIndex..<str.endIndex
str[range] // "Hello, playground"
Mit den einseitigen Bereichen von Swift 4 kann der Bereich auf eine der folgenden Formen vereinfacht werden.
let range = str.startIndex...
let range = ..<str.endIndex
Ich werde das vollständige Formular in den folgenden Beispielen aus Gründen der Klarheit verwenden, aber aus Gründen der Lesbarkeit möchten Sie wahrscheinlich die einseitigen Bereiche in Ihrem Code verwenden.
after
Wie in: index(after: String.Index)
after bezieht sich auf den Index des Zeichens direkt nach dem angegebenen Index.
Beispiele
// 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
Wie in: index(before: String.Index)
before bezieht sich auf den Index des Zeichens direkt vor dem angegebenen Index.
Beispiele
// 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
Wie in: index(String.Index, offsetBy: String.IndexDistance)
- Der
offsetByWert kann positiv oder negativ sein und beginnt mit dem angegebenen Index. Obwohl es vom Typ ist String.IndexDistance, können Sie ihm eine geben Int.
Beispiele
// 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
Wie in: index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)
- Dies
limitedByist nützlich, um sicherzustellen, dass der Index durch den Versatz nicht außerhalb der Grenzen liegt. Es ist ein Begrenzungsindex. Da der Offset den Grenzwert überschreiten kann, gibt diese Methode eine Option zurück. Es wird zurückgegeben, nilwenn der Index außerhalb der Grenzen liegt.
Beispiel
// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}
Wenn der Offset 77anstelle von gewesen wäre 7, ifwäre die Anweisung übersprungen worden.
Warum wird String.Index benötigt?
Es wäre viel einfacher, einen IntIndex für Strings zu verwenden. Der Grund, warum Sie String.Indexfür jeden String einen neuen erstellen müssen, ist, dass die Zeichen in Swift unter der Haube nicht alle gleich lang sind. Ein einzelnes Swift-Zeichen kann aus einem, zwei oder sogar mehr Unicode-Codepunkten bestehen. Daher muss jeder eindeutige String die Indizes seiner Zeichen berechnen.
Es ist möglicherweise möglich, diese Komplexität hinter einer Int-Index-Erweiterung zu verbergen, aber ich zögere dies. Es ist gut, daran erinnert zu werden, was tatsächlich passiert.
startIndexsollte etwas anderes als 0 sein?