Achtung: Bitte siehe Leo Dabus' Antwort für eine korrekte Implementierung für Swift 4 und Swift 5.
Swift 4 oder neuer
Der Typ Substring
wurde in Swift 4 eingeführt, um Teilzeichenfolgen schneller und effizienter zu machen, indem der Speicher mit der ursprünglichen Zeichenfolge gemeinsam genutzt wird, so dass die Indexfunktionen das zurückgeben sollten.
Probieren Sie es hier aus
extension StringProtocol {
subscript(offset: Int) -> Character { self[index(startIndex, offsetBy: offset)] }
subscript(range: Range) -> SubSequence {
let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
return self[startIndex..) -> SubSequence {
let startIndex = index(self.startIndex, offsetBy: range.lowerBound)
return self[startIndex..) -> SubSequence { self[index(startIndex, offsetBy: range.lowerBound)...] }
subscript(range: PartialRangeThrough) -> SubSequence { self[...index(startIndex, offsetBy: range.upperBound)] }
subscript(range: PartialRangeUpTo) -> SubSequence { self[..
``
Um den Substring
in einen String
umzuwandeln, können Sie einfach String(string[0..2])
verwenden, sollten dies aber nur tun, wenn Sie die Teilzeichenfolge behalten möchten. Andernfalls ist es effizienter, es als Substring
zu belassen.
Es wäre großartig, wenn jemand einen guten Weg finden könnte, diese beiden Erweiterungen in einer zu vereinen. Ich habe versucht, StringProtocol
zu erweitern, jedoch ohne Erfolg, da die index
-Methode dort nicht existiert. Hinweis: Diese Antwort wurde bereits bearbeitet, ist ordnungsgemäß implementiert und funktioniert jetzt auch für Teilzeichenfolgen. Stellen Sie einfach sicher, dass Sie einen gültigen Bereich verwenden, um Abstürze bei der Indizierung Ihres StringProtocol-Typs zu vermeiden. Für die Indizierung mit einem Bereich, der nicht mit Werten außerhalb des Bereichs abstürzt, können Sie diese Implementierung verwenden
Warum ist dies nicht eingebaut?
Die Fehlermeldung sagt "siehe die Dokumentationskommentare für die Diskussion". Apple liefert in der Datei UnavailableStringAPIs.swift folgende Erklärung:
Das Indizierung von Strings mit ganzen Zahlen ist nicht verfügbar.
Das Konzept des "i-ten Zeichens in einem String" hat in verschiedenen Bibliotheken und Systemkomponenten unterschiedliche Interpretationen. Die richtige Interpretation sollte je nach Anwendungsfall und den beteiligten APIs ausgewählt werden, daher kann die Indizierung von String
mit einer ganzen Zahl nicht erfolgen.
Swift bietet verschiedene Möglichkeiten, auf die in Strings gespeicherten Zeichendaten zuzugreifen.
-
String.utf8
ist eine Sammlung von UTF-8-Codeeinheiten in der Zeichenfolge. Verwenden Sie diese API, wenn Sie die Zeichenfolge in UTF-8 umwandeln. Die meisten POSIX-APIs verarbeiten Zeichenfolgen von UTF-8-Codeeinheiten.
-
String.utf16
ist eine Sammlung von UTF-16-Codeeinheiten in der Zeichenfolge. Die meisten Cocoa- und Cocoa-Touch-APIs verarbeiten Zeichenfolgen von UTF-16-Codeeinheiten. Zum Beispiel verwenden Instanzen von NSRange
verwendet mit NSAttributedString
und NSRegularExpression
speichern Unterzeichenfolgenoffsets und -längen in Form von UTF-16-Codeeinheiten.
-
String.unicodeScalars
ist eine Sammlung von Unicode-Scalars. Verwenden Sie diese API, wenn Sie eine Low-Level-Manipulation der Zeichendaten durchführen.
-
String.characters
ist eine Sammlung von erweiterten Graphemclustern, die eine Näherung an vom Benutzer wahrgenommene Zeichen sind.
Beachten Sie, dass bei der Verarbeitung von Zeichenfolgen mit menschenlesbarem Text die zeichenweise Verarbeitung möglichst vermieden werden sollte. Verwenden Sie stattdessen hochrangige, ortsabhängige Unicode-Algorithmen, zum Beispiel, String.localizedStandardCompare()
, String.localizedLowercaseString
, String.localizedStandardRangeOfString()
usw.
``