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?é
. Es besteht eigentlich aus deme
Plus einer\u{301}
Unicode-Darstellung. Wenn Sie einen Index von Null verwenden, erhalten Sie entweder dase
Zeichen oder das Akzentzeichen ("Grab"), nicht den gesamten Cluster, aus dem sich das Zeichen zusammensetzté
. WennstartIndex
Sie die Option verwenden, erhalten Sie den gesamten Graphemcluster für jedes Zeichen.String.Index
aus einer ganzen Zahl, außer eine Dummy-Zeichenfolge zu erstellen und die.index
Methode darauf anzuwenden? Ich weiß nicht, ob mir etwas fehlt, aber die Dokumente sagen nichts.String.Index
mit einer ganzen Zahl konstruierst, da jeder SwiftCharacter
nicht unbedingt dem entspricht, was du mit einer ganzen Zahl meinst. Sie können jedoch eine Ganzzahl an denoffsetBy
Parameter übergeben, um eine zu erstellenString.Index
. Wenn Sie jedoch keine habenString
, können Sie keine erstellenString.Index
(da Swift den Index nur berechnen kann, wenn es die vorherigen Zeichen in der Zeichenfolge kennt). Wenn Sie die Zeichenfolge ändern, müssen Sie den Index neu berechnen. Sie können nicht dasselbeString.Index
für zwei verschiedene Zeichenfolgen verwenden.quelle
Erstellen Sie eine UITextView in einem tableViewController. Ich habe die Funktion textViewDidChange verwendet und dann nach Eingabetasten gesucht. Wenn die Eingabetaste erkannt wurde, löschen Sie die Eingabe der Eingabetaste und schließen Sie die Tastatur.
quelle