Einfach rückwärts zugreifen
Der beste Weg ist, substringToIndex
kombiniert mit dem zu verwendenendIndex
Eigenschaft und der advance
globalen Funktion.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
Auf der Suche nach einer Saite von hinten
Verwenden rangeOfString
und einstellen options
auf.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Keine Erweiterungen, reine Redewendung Swift
Swift 2.0
advance
ist jetzt ein Teil von Index
und heißt advancedBy
. Du machst es wie:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
Sie können nicht nennen advancedBy
auf eine , String
weil sie variabler Größe Elemente. Du musst benutzen index(_, offsetBy:)
.
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Viele Dinge wurden umbenannt. Die Fälle sind in camelCase geschrieben, startIndex
wurden lowerBound
.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
Außerdem würde ich nicht empfehlen, das Auspacken zu erzwingen index2
. Sie können die optionale Bindung oder verwenden map
. Persönlich bevorzuge ich map
:
var substring3 = index2.map(string2.substring(to:))
Swift 4
Die Swift 3-Version ist noch gültig, aber jetzt können Sie Indizes mit Indexbereichen verwenden:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
Der zweite Ansatz bleibt unverändert:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))
string1.endIndex.advancedBy(-4)
funktioniert für mich anstelle vonadvance
NSString
ist offensichtlich auch schlecht, weil wir alle irgendwann von den Foundation (Legacy) -Klassen weg wollen. Also ... mehr schimpfen!string1[..<index1]
. Keine Notwendigkeit fürstring1.startIndex
.Swift 3, XCode 8
Da
advancedBy(Int)
ist weg, seit Swift 3 dieString
Methode verwendetindex(String.Index, Int)
. Schauen Sie sich dieseString
Erweiterung mit Teilzeichenfolge und Freunden an:AKTUALISIERTE Erweiterung für Swift 4
Verwendung:
PS Es ist wirklich seltsam, dass Entwickler gezwungen sind, sich damit zu befassen,
String.Index
anstatt einfachInt
. Warum sollten wir uns um die interneString
Mechanik kümmern und nicht nur einfachesubstring()
Methoden haben?quelle
encodedOffset
diesen Kommentar und den richtigen Weg nicht verwenden, um dies zu erreichen. Stackoverflow.com/questions/34540185/…Ich würde es mit einem Index (
s[start..<end]
) tun :Swift 3, 4, 5
quelle
bearbeiten / aktualisieren:
In Swift 4 oder höher (Xcode 10.0+) können Sie die neue BidirectionalCollection- Methode lastIndex (von :) verwenden.
quelle
So mache ich es. Sie können es genauso machen oder diesen Code für Ideen verwenden.
Hier sind die Erweiterungen, die ich benutze:
Credit albertbori / Common Swift String Extensions
Im Allgemeinen bin ich ein starker Befürworter von Erweiterungen, insbesondere für Anforderungen wie String-Manipulation, Suche und Slicing.
quelle
String
hat eingebaute Teilzeichenfolge-Funktion:Wenn Sie "zum ersten Index eines Zeichens gehen" möchten , können Sie die Teilzeichenfolge mithilfe der integrierten
find()
Funktion abrufen :Um den letzten Index zu finden , können wir implementieren
findLast()
.HINZUGEFÜGT:
Vielleicht ist eine
BidirectionalIndexType
spezielle Version vonfindLast
schneller:quelle
Sie können diese Erweiterungen verwenden:
Swift 2.3
Swift 3
Verwendung:
quelle
Swift 4:
Sie können es wie folgt testen:
Überprüfen Sie die Bibliothek https://gitlab.com/seriyvolk83/SwiftEx . Es enthält diese und andere hilfreiche Methoden.
quelle
Möchten Sie eine Teilzeichenfolge einer Zeichenfolge vom Startindex bis zum letzten Index eines ihrer Zeichen abrufen? In diesem Fall können Sie eine der folgenden Swift 2.0+ Methoden auswählen.
Methoden, die erfordern
Foundation
Holen Sie sich eine Teilzeichenfolge, die den letzten Index eines Zeichens enthält:
Holen Sie sich einen Teilstring, der NICHT den letzten Index eines Zeichens enthält:
Wenn Sie diese Vorgänge wiederholen müssen,
String
kann eine Erweiterung eine gute Lösung sein:Methoden, die NICHT erforderlich sind
Foundation
Holen Sie sich eine Teilzeichenfolge, die den letzten Index eines Zeichens enthält:
Holen Sie sich einen Teilstring, der NICHT den letzten Index eines Zeichens enthält:
Wenn Sie diese Vorgänge wiederholen müssen,
String
kann eine Erweiterung eine gute Lösung sein:quelle
Hier ist eine einfache und kurze Möglichkeit, einen Teilstring zu erhalten, wenn Sie den Index kennen:
Die App stürzt nicht ab, wenn Ihr Index die Länge der Zeichenfolge überschreitet:
Beide Beispiele sind Swift 3-fähig .
quelle
Das einzige, was Klappern hinzufügt, ist das wiederholte
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
In Swift 4
Eine Erweiterung kann einige davon reduzieren:
Dann Verwendung:
Es ist zu beachten, dass
to
undfrom
TypSubstring
(oderString.SubSequance
) sind. Sie weisen keine neuen Zeichenfolgen zu und sind für die Verarbeitung effizienter.Um einen
String
Typ zurückzubekommen,Substring
muss Folgendes zurückgesetzt werdenString
:Hier wird schließlich eine Zeichenfolge zugewiesen.
quelle
quelle
Swift 3
Guter Artikel zum Verständnis, warum brauchen wir das?
quelle
Ich habe String um zwei Teilstring-Methoden erweitert. Sie können Teilzeichenfolgen mit einem Bereich von / bis oder von / Länge wie folgt aufrufen:
quelle
Swift 2.0 Der folgende Code wurde auf XCode 7.2 getestet. Bitte beachten Sie den beigefügten Screenshot unten
quelle
In Swift 5
Wir benötigen
String.Index
anstelle eines einfachen Int-Werts den Index.Denken Sie auch daran, wenn wir versuchen, SubString von Swift
String
( Werttyp ) abzurufen , müssen wir tatsächlich mit demSequence
Protokoll iterieren , das denString.SubSequence
Typ anstelle von zurückgibtString
Typs .Zurück zu bekommen
String
ausString.SubSequence
, VerwendungString(subString)
Beispiel wie folgt:
quelle
Für Swift 2.0 ist es so:
quelle
Ich habe den Beitrag von andrewz geändert, um ihn mit Swift 2.0 (und möglicherweise Swift 3.0) kompatibel zu machen. Meiner bescheidenen Meinung nach ist diese Erweiterung leichter zu verstehen und ähnelt dem, was in anderen Sprachen (wie PHP) verfügbar ist .
quelle
Ich baue auch eine einfache String-Erweiterung für Swift 4:
Sie können es also einfach so nennen:
quelle
Versuchen Sie diese
Int-based
Problemumgehung:Hinweis: Es ist nur eine Übung. Es überprüft nicht die Grenze. An Ihre Bedürfnisse anpassen.
quelle
Hier ist eine einfache Möglichkeit, Teilzeichenfolgen in Swift abzurufen
quelle