Alle folgenden Beispiele verwenden
var str = "Hello, playground"
startIndex
und endIndex
startIndex
ist der Index des ersten Zeichens
endIndex
ist 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
offsetBy
Wert 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
limitedBy
ist 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, nil
wenn 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 77
anstelle von gewesen wäre 7
, if
wäre die Anweisung übersprungen worden.
Warum wird String.Index benötigt?
Es wäre viel einfacher, einen Int
Index für Strings zu verwenden. Der Grund, warum Sie String.Index
fü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.
startIndex
sollte etwas anderes als 0 sein?