Powiedz, że mam tutaj ciąg:
var fullName: String = "First Last"
Chcę podzielić podstawę ciągu na białe znaki i przypisać wartości do odpowiednich zmiennych
var fullNameArr = // something like: fullName.explode(" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Czasami użytkownicy mogą nie mieć nazwiska.
fullName.utf8.split( <utf-8 character code> )
działa tak samo (wymienić.utf8
z.utf16
UTF-16). Na przykład podział+
można wykonać za pomocąfullName.utf8.split(43)
Odpowiedzi:
Szybkim sposobem jest użycie
split
funkcji globalnej , takiej jak:z Swift 2
W Swift 2 użycie podziału staje się nieco bardziej skomplikowane ze względu na wprowadzenie wewnętrznego typu CharacterView. Oznacza to, że String nie przyjmuje już protokołów SequenceType ani CollectionType, a zamiast tego należy użyć
.characters
właściwości, aby uzyskać dostęp do reprezentacji typu String znaków w postaci CharacterView. (Uwaga: CharacterView przyjmuje protokoły SequenceType i CollectionType).źródło
split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false)
.componentsSeparatedByString()
metody, jeśli separator jest dłuższy niż pojedynczy znak. I choć fajnie by było powiedziećlet (firstName, lastName) = split(fullName) {$0 == ' '}
, to niestety nie działa.split("a,b;c,d") {$0 == "," || $0 == ";"}
lubsplit("a,b;c,d") {contains(",;", $0)}
Wystarczy wywołać
componentsSeparatedByString
metodę na swoimfullName
Aktualizacja dla Swift 3+
źródło
NSString
(Swift automatycznie zamienia je podczas importowaniaFoundation
).[String]
) w Xcode 7.2.Najłatwiejszą metodą na to jest skorzystanie z componentsSeparatedBy:
W przypadku Swift 2:
W przypadku Swift 3:
źródło
.componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
componentsSeparatedByString
icomponentsSeparatedByCharactersInSet
Swift Dev. 4.0 (24 maja 2017 r.)
Nowa funkcja
split
w Swift 4 ( Beta ).Wynik:
Dostęp do wartości:
Xcode 8.1 / Swift 3.0.1
Oto sposób, w jaki wiele separatorów z tablicą.
Wynik:
źródło
import Foundation
do klasy, w której używasz tego. #SavedYouFiveMinuteslet a="a,,b,c"
i używasza.split(separator: ",")
,["a", "b", c"]
domyślnie dostajesz tablicę jak . Można to zmienić, używającomittingEmptySubsequences: false
domyślnie true.Swift 4 lub nowszy
Jeśli potrzebujesz tylko poprawnie sformatować nazwisko osoby, możesz użyć PersonNameComponentsFormatter .
edycja / aktualizacja:
Swift 5 lub nowszy
Aby po prostu podzielić ciąg znaków na znaki nieliterowe, możemy użyć nowej właściwości Character
isLetter
:źródło
fullName.split { $0.isWhitespace }.map(String.init)
let words = line.split{ $0.isWhitespace }.map{ String($0)}
Dzięki @LeoDabus za twoją wersję (w moim oryginalnym komentarzu brakowało kodu). Sugeruję również przeniesienie wersji Swift 5 na górę odpowiedzi.Alternatywnie do odpowiedzi WMiosa możesz także użyć
componentsSeparatedByCharactersInSet
, co może być przydatne w przypadku, gdy masz więcej separatorów (spacja, przecinek itp.).Z twoim konkretnym wkładem:
Korzystanie z wielu separatorów:
źródło
,
lub;
lub inny separatorSzybki 4
źródło
Problem z białymi znakami
Ogólnie rzecz biorąc, ludzie na nowo odkrywają ten problem i złe rozwiązania w kółko. Czy to jest przestrzeń? „”, a co z „\ n”, „\ t” lub jakimś znakiem białych znaków unicode, którego nigdy nie widziałeś, w niemałej części, ponieważ jest niewidoczny. Chociaż możesz uciec
Słabe rozwiązanie
Jeśli kiedykolwiek potrzebujesz uścisnąć rzeczywistość, obejrzyj wideo WWDC na temat ciągów lub dat. Krótko mówiąc, prawie zawsze lepiej jest pozwolić Apple na rozwiązanie tego rodzaju przyziemnego zadania.
Solidne rozwiązanie: użyj NSCharacterSet
Aby to zrobić poprawnie, IMHO, należy użyć,
NSCharacterSet
ponieważ, jak wspomniano wcześniej, biała spacja może nie być tym, czego oczekujesz, a Apple dostarczył zestaw znaków białych spacji. Aby zapoznać się z różnymi dostarczonymi zestawami znaków, zapoznaj się z dokumentacją dla deweloperów NSCharacterSet firmy Apple, a dopiero potem rozbuduj lub skonstruuj nowy zestaw znaków, jeśli nie pasuje on do twoich potrzeb.NSCharacterSet białe znaki
źródło
W Swift 4.2 i Xcode 10
opcja 1
Opcja 2
Opcja 3
Opcja 4
Dokumentacja Apple ....
źródło
Swift 4 znacznie ułatwia dzielenie znaków, wystarczy skorzystać z nowej funkcji podziału dla ciągów.
Przykład:
let s = "hi, hello" let a = s.split(separator: ",") print(a)
Teraz masz tablicę z „cześć” i „cześć”.
źródło
Aktualizacja do Swift 5 i najprostszy sposób
To drukuje,
Jeśli jednak chcesz odfiltrować pusty ciąg,
Wynik,
Ale upewnij się, że Fundacja została zaimportowana
źródło
Szybki 3
AAA
,BBB
iCCC
.whitespaces
z.whitespacesAndNewlines
źródło
Aktualizacja Swift 4, Xcode 10 i iOS 12 działa w 100%
Aby uzyskać więcej informacji, zobacz dokumentację Apple tutaj .
źródło
Xcode 8.0 / Swift 3
Długa droga:
źródło
Miałem scenariusz, w którym w ciągu, który chcę podzielić, może znajdować się wiele znaków kontrolnych. Zamiast utrzymywać całą ich gamę, po prostu pozwalam Apple obsługiwać tę część.
Następujące działa z Swift 3.0.1 na iOS 10:
źródło
Znalazłem interesującą sprawę
metoda 1
Kiedy użyłem tego polecenia, podzieliłem jakiś symbol od danych załadowanych z serwera , można go podzielić podczas testowania w symulatorze i zsynchronizować z urządzeniem testowym, ale nie podzieli się w aplikacji do publikowania i Ad Hoc
Śledzenie tego błędu zajmuje mi dużo czasu. Może być przeklęty przez jakąś wersję Swift, wersję iOS lub żadną
Nie chodzi też o kod HTML, ponieważ próbuję stringByRemovingPercentEncoding i nadal nie działa
dodatek 10/10/2015
w Swift 2.0 metoda ta została zmieniona na
metoda 2
Kiedy użyłem tego polecenia, może on poprawnie podzielić te same dane, które ładują się z serwera
Wniosek, naprawdę sugeruję użycie metody 2
źródło
Większość z tych odpowiedzi zakłada, że dane wejściowe zawierają spację - nie białą spację i jedną spację. Jeśli możesz bezpiecznie przyjąć to założenie, to zaakceptowana odpowiedź (od Bennetta) jest dość elegancka, a także metoda, którą zastosuję, kiedy będę mogła.
Kiedy nie możemy przyjąć tego założenia, bardziej niezawodne rozwiązanie musi obejmować następujące wskazówki, których większość odpowiedzi tutaj nie bierze pod uwagę:
\n
) i Windows (\r\n
)Aby uwzględnić te przypadki, to rozwiązanie używa wyrażenia regularnego do konwersji wszystkich białych znaków (w tym znaków cyklicznych i znaków nowej linii Windows) na pojedynczą spację, przycina, a następnie dzieli na jedną spację:
Swift 3:
źródło
Lub bez zamknięć możesz to zrobić w Swift 2:
źródło
Kroki dzielenia łańcucha na tablicę w Swift 4.
Uwaga: zmiennaNazwa.komponenty (oddzielone przez: „podzielone słowo kluczowe”)
źródło
Szybki 4
Wynik
źródło
Załóżmy, że masz zmienną o nazwie „Hello World”, a jeśli chcesz ją podzielić i zapisać w dwóch różnych zmiennych, możesz użyć tego w następujący sposób:
źródło
Tylko
split
poprawna odpowiedź, oto różnica dla więcej niż 2 spacji.źródło
Xcode 7.2 (7C68)
źródło
Dodano obsługę błędów Swift 2.2 i pisownię wielkimi literami:
źródło
Obsługa ciągów jest wciąż wyzwaniem w Swift i ciągle się zmienia, jak widać z innych odpowiedzi. Mam nadzieję, że wszystko się uspokoi i stanie się prostsze. W ten sposób można to zrobić w obecnej wersji Swift 3.0 z wieloma znakami separatora.
Swift 3:
źródło
Szukałem luźnego podziału, takiego jak PHP, w
explode
którym puste tablice są zawarte w wynikowej tablicy, to zadziałało dla mnie:Wynik:
źródło
Daje to szereg bezpośrednio podzielonych części
możesz użyć w ten sposób,
źródło
Zmieniło się to ponownie w wersji Beta 5. Weee! Jest to teraz metoda na CollectionType
Stary:
Nowy:
Informacje o wydaniu jabłek
źródło
Dla szybkiego 2, XCode 7.1:
źródło
Oto algorytm, który właśnie zbudowałem, który podzieli
String
dowolnąCharacter
z tablicy, a jeśli zachodzi potrzeba zachowania podciągów za pomocą rozdzielonych znaków, można ustawićswallow
parametr natrue
.Xcode 7.3 - Swift 2.2:
Przykład:
źródło