Dostęp do wstecz
Najlepszym sposobem jest użycie substringToIndex
kombinacji do endIndex
właściwości i advance
funkcji globalnej.
var string1 = "www.stackoverflow.com"
var index1 = advance(string1.endIndex, -4)
var substring1 = string1.substringToIndex(index1)
Szukam sznurka zaczynającego się od tyłu
Użyj rangeOfString
i ustaw options
na.BackwardsSearch
var string2 = "www.stackoverflow.com"
var index2 = string2.rangeOfString(".", options: .BackwardsSearch)?.startIndex
var substring2 = string2.substringToIndex(index2!)
Bez rozszerzeń, czysty idiomatyczny Swift
Swift 2.0
advance
jest teraz częścią Index
i nazywa się advancedBy
. Robisz to jak:
var string1 = "www.stackoverflow.com"
var index1 = string1.endIndex.advancedBy(-4)
var substring1 = string1.substringToIndex(index1)
Swift 3.0
Nie możesz wywołać advancedBy
a, String
ponieważ zawiera elementy o zmiennej wielkości. Musisz użyć index(_, offsetBy:)
.
var string1 = "www.stackoverflow.com"
var index1 = string1.index(string1.endIndex, offsetBy: -4)
var substring1 = string1.substring(to: index1)
Wiele rzeczy zostało przemianowanych. Sprawy są napisane w camelCase, startIndex
stało się lowerBound
.
var string2 = "www.stackoverflow.com"
var index2 = string2.range(of: ".", options: .backwards)?.lowerBound
var substring2 = string2.substring(to: index2!)
Nie polecałbym też rozpakowywania na siłę index2
. Możesz użyć opcjonalnego łączenia lub map
. Osobiście wolę używać map
:
var substring3 = index2.map(string2.substring(to:))
Szybki 4
Wersja Swift 3 jest nadal aktualna, ale teraz możesz używać indeksów dolnych z zakresami indeksów:
let string1 = "www.stackoverflow.com"
let index1 = string1.index(string1.endIndex, offsetBy: -4)
let substring1 = string1[..<index1]
Drugie podejście pozostaje niezmienione:
let string2 = "www.stackoverflow.com"
let index2 = string2.range(of: ".", options: .backwards)?.lowerBound
let substring3 = index2.map(string2.substring(to:))
string1.endIndex.advancedBy(-4)
działa dla mnie zamiastadvance
NSString
jest oczywiście również zła, ponieważ ostatecznie wszyscy chcemy uciec od klas podstawowych (starszych). A więc… bardziej rantowanie!string1[..<index1]
. Nie ma potrzebystring1.startIndex
.Swift 3, XCode 8
Ponieważ
advancedBy(Int)
nie ma, ponieważ Swift 3 używaString
metodyindex(String.Index, Int)
. Sprawdź toString
rozszerzenie z podciągiem i przyjaciółmi:ZAKTUALIZOWANE rozszerzenie dla Swift 4
Stosowanie:
PS To naprawdę dziwne, że programiści musieli sobie radzić, a
String.Index
nie zwyczajnieInt
. Dlaczego mielibyśmy przejmować się wewnętrznąString
mechaniką, a nie tylko prostymisubstring()
metodami?źródło
encodedOffset
tego komentarza i prawidłowego sposobu na wykonanie tego stackoverflow.com/questions/34540185/ ...Zrobiłbym to za pomocą indeksu dolnego (
s[start..<end]
):Swift 3, 4, 5
źródło
edytuj / aktualizuj:
W Swift 4 lub nowszym (Xcode 10.0+) możesz użyć nowej metody BidirectionalCollection lastIndex (z :)
źródło
Oto jak to robię. Możesz to zrobić w ten sam sposób lub użyć tego kodu do tworzenia pomysłów.
Oto rozszerzenia, których używam:
Credit albertbori / Common Swift String Extensions
Generalnie jestem zdecydowanym zwolennikiem rozszerzeń, szczególnie dla potrzeb takich jak manipulacja ciągami, wyszukiwanie i krojenie.
źródło
String
ma wbudowaną funkcję podciągu:Jeśli chcesz "przejść do pierwszego indeksu znaku", możesz uzyskać podłańcuch za pomocą
find()
funkcji wbudowanej :Aby znaleźć ostatni indeks, możemy zaimplementować
findLast()
.DODANY:
Być może
BidirectionalIndexType
wyspecjalizowana wersjafindLast
jest szybsza:źródło
Możesz użyć tych rozszerzeń:
Swift 2.3
Szybki 3
Stosowanie:
źródło
Swift 4:
możesz to przetestować w następujący sposób:
Sprawdź bibliotekę https://gitlab.com/seriyvolk83/SwiftEx . Zawiera te i inne pomocne metody.
źródło
Czy chcesz pobrać podłańcuch łańcucha od indeksu początkowego do ostatniego indeksu jednego z jego znaków? Jeśli tak, możesz wybrać jedną z następujących metod Swift 2.0+.
Metody, które wymagają
Foundation
Pobierz podciąg zawierający ostatni indeks znaku:
Pobierz podciąg, który NIE ZAWIERA ostatniego indeksu znaku:
Jeśli musisz powtórzyć te operacje, rozszerzenie
String
może być dobrym rozwiązaniem:Metody, które NIE wymagają
Foundation
Pobierz podciąg zawierający ostatni indeks znaku:
Pobierz podciąg, który NIE ZAWIERA ostatniego indeksu znaku:
Jeśli musisz powtórzyć te operacje, rozszerzenie
String
może być dobrym rozwiązaniem:źródło
Oto prosty i krótki sposób uzyskania podciągu, jeśli znasz indeks:
Nie spowoduje to awarii aplikacji, jeśli indeks przekracza długość ciągu:
Oba przykłady są gotowe do obsługi Swift 3 .
źródło
Jedyną rzeczą, która dodaje stukotu, jest powtarzanie
stringVar
:stringVar [ stringVar .index ( stringVar .startIndex, offsetBy: ...)
W Swift 4
Rozszerzenie może częściowo z tego zmniejszyć:
Następnie użycie:
Należy zauważyć, że
to
ifrom
są typemSubstring
(lubString.SubSequance
). Nie przydzielają nowych ciągów i są bardziej wydajne w przetwarzaniu.Aby przywrócić
String
typ,Substring
należy go przesłać z powrotem doString
:W tym miejscu ostatecznie przydzielany jest ciąg.
źródło
źródło
Szybki 3
Dobry artykuł do zrozumienia, dlaczego tego potrzebujemy
źródło
Rozszerzyłem String o dwie metody podciągowe. Możesz wywołać podciąg z zakresem od / do lub from / length w następujący sposób:
źródło
Swift 2.0 Poniższy kod jest testowany na XCode 7.2. Proszę odnieść się do załączonego zrzutu ekranu na dole
źródło
W Swift 5
Potrzebujemy
String.Index
zamiast prostej wartości Int do reprezentowania indeksu.Pamiętaj również, że kiedy próbujemy pobrać subString ze Swift
String
(typ wartości), w rzeczywistości musimy iterować zSequence
protokołem, który zwracaString.SubSequence
typ zamiastString
typu.Aby wrócić
String
zString.SubSequence
, użytkowaniaString(subString)
Przykład jak poniżej:
źródło
W przypadku Swift 2.0 wygląda to tak:
źródło
Zmodyfikowałem post Andrewza, aby był kompatybilny ze Swift 2.0 (i może Swift 3.0). Moim skromnym zdaniem to rozszerzenie jest łatwiejsze do zrozumienia i podobne do tego, co jest dostępne w innych językach (np. PHP).
źródło
Tworzę również proste rozszerzenie String dla Swift 4:
Możesz więc łatwo to nazwać tak:
źródło
Wypróbuj to
Int-based
obejście:Uwaga: to tylko praktyka. Nie sprawdza granic. Modyfikuj zgodnie ze swoimi potrzebami.
źródło
Oto prosty sposób na uzyskanie podciągu w języku Swift
źródło