Alle folgenden Beispiele verwenden
var str = "Hello, playground"
Swift 4
Strings wurden in Swift 4 ziemlich gründlich überarbeitet. Wenn Sie jetzt einen Teilstring von einem String erhalten, erhalten Sie einen Substring
Typ zurück und nicht einen String
. Warum ist das? Zeichenfolgen sind Werttypen in Swift. Das heißt, wenn Sie einen String verwenden, um einen neuen zu erstellen, muss dieser kopiert werden. Dies ist gut für die Stabilität (niemand anderes wird es ohne Ihr Wissen ändern), aber schlecht für die Effizienz.
Ein Teilstring hingegen verweist auf den ursprünglichen String, aus dem er stammt. Hier ist ein Bild aus der Dokumentation, das dies veranschaulicht.
Es ist kein Kopieren erforderlich, daher ist die Verwendung wesentlich effizienter. Stellen Sie sich jedoch vor, Sie hätten eine zehnstellige Teilzeichenfolge aus einer Zeichenfolge mit einer Million Zeichen. Da der Teilstring auf den String verweist, müsste das System den gesamten String so lange festhalten, wie der Teilstring vorhanden ist. Wenn Sie also Ihren Teilstring bearbeitet haben, konvertieren Sie ihn in einen String.
let myString = String(mySubstring)
Dadurch wird nur der Teilstring kopiert und der Speicher mit dem alten String kann zurückgefordert werden . Teilzeichenfolgen (als Typ) sollen von kurzer Dauer sein.
Eine weitere große Verbesserung in Swift 4 ist, dass Strings (wieder) Sammlungen sind. Das bedeutet, dass Sie alles, was Sie mit einer Sammlung tun können, mit einem String tun können (Indizes verwenden, Zeichen durchlaufen, filtern usw.).
Die folgenden Beispiele zeigen, wie Sie einen Teilstring in Swift erhalten.
Teilzeichenfolgen abrufen
Sie können einen Teilstring aus einem String erhalten , indem Indizes oder eine Reihe anderer Methoden (zum Beispiel unter Verwendung von prefix
, suffix
, split
). Sie müssen String.Index
jedoch weiterhin einen Int
Index für den Bereich verwenden und nicht . (Siehe meine andere Antwort, wenn Sie dabei Hilfe benötigen.)
Anfang einer Zeichenfolge
Sie können einen Index verwenden (beachten Sie den einseitigen Bereich von Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
oder prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
oder noch einfacher:
let mySubstring = str.prefix(5) // Hello
Ende einer Zeichenfolge
Verwenden von Indizes:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
oder suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
oder noch einfacher:
let mySubstring = str.suffix(10) // playground
Beachten Sie, dass suffix(from: index)
ich bei der Verwendung von vom Ende an mit zurückzählen musste -10
. Dies ist nicht erforderlich, wenn nur suffix(x)
die letzten x
Zeichen eines Strings verwendet werden.
Bereich in einer Zeichenfolge
Auch hier verwenden wir einfach Indizes.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Konvertieren Substring
inString
Vergessen Sie nicht, wenn Sie bereit sind, Ihren Teilstring zu speichern, sollten Sie ihn in einen konvertieren, String
damit der Speicher des alten Strings bereinigt werden kann.
let myString = String(mySubstring)
Verwenden Sie eine Int
Indexerweiterung?
Ich zögere, eine Int
basierte Indexerweiterung zu verwenden, nachdem ich den Artikel Strings in Swift 3 von Airspeed Velocity und Ole Begemann gelesen habe . Obwohl Strings in Swift 4 Sammlungen sind, hat das Swift-Team absichtlich keine Int
Indizes verwendet. Es ist immer noch String.Index
. Dies hat damit zu tun, dass Swift-Zeichen aus einer unterschiedlichen Anzahl von Unicode-Codepunkten bestehen. Der tatsächliche Index muss für jede Zeichenfolge eindeutig berechnet werden.
Ich muss sagen, ich hoffe, dass das Swift-Team String.Index
in Zukunft einen Weg findet, sich zu abstrahieren . Aber bis sie sich dafür entscheiden, ihre API zu verwenden. Es hilft mir, mich daran zu erinnern, dass String-Manipulationen nicht nur einfache Int
Index-Lookups sind.