Podzielić ciąg znaków na tablicę w Swift?

687

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.

blee908
źródło
13
Cześć, nie mam komputera Mac do sprawdzenia. Ale możesz spróbować „fullName.componentsSeparatedByString (string:„ ”)” Nie kopiuj i nie wklejaj, użyj funkcji autouzupełniania, aby uzyskać właściwą funkcję.
David Gölzhäuser
Jeśli jesteś dzielenie tylko jednego znaku, używając fullName.utf8.split( <utf-8 character code> )działa tak samo (wymienić .utf8z .utf16UTF-16). Na przykład podział +można wykonać za pomocąfullName.utf8.split(43)
Jojodmo
Ponadto czasami w nazwach znajdują się spacje, jak w „Daphne du Maurier” lub „Charles de Lint”
Berry

Odpowiedzi:

784

Szybkim sposobem jest użycie splitfunkcji globalnej , takiej jak:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

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ć .characterswłaściwości, aby uzyskać dostęp do reprezentacji typu String znaków w postaci CharacterView. (Uwaga: CharacterView przyjmuje protokoły SequenceType i CollectionType).

let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)

fullNameArr[0] // First
fullNameArr[1] // Last 
Ethan
źródło
98
W moich testach componentSeparatedByString jest zwykle znacznie szybszy, szczególnie w przypadku łańcuchów wymagających podziału na wiele części. Ale dla przykładu wymienionego przez PO, jedno powinno wystarczyć.
Casey Perkins,
9
Od Xcode 6.2b3 split może być używany jako split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false).
Pascal
14
Pamiętaj tylko, że nadal musisz użyć starej 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.
NRitH
3
@ Kashif, a następnie można użyć split("a,b;c,d") {$0 == "," || $0 == ";"}lubsplit("a,b;c,d") {contains(",;", $0)}
Ethan
4
Poprawny kod dla Xcode 7.0 jest dozwolony fullNameArr = fullName.characters.split {$ 0 == ""} .map (String.init). Próbowałem edytować, ale został odrzucony.
skagedal
1015

Wystarczy wywołać componentsSeparatedByStringmetodę na swoimfullName

import Foundation

var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]

Aktualizacja dla Swift 3+

import Foundation

let fullName    = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")

let name    = fullNameArr[0]
let surname = fullNameArr[1]
Chen-Tsu Lin
źródło
3
Należy pamiętać, że tak naprawdę jest to podstawa NSString(Swift automatycznie zamienia je podczas importowania Foundation).
Czy
1
Tak już nie jest w Swift 1.2, w którym Apple nie konwertuje już automatycznie Swift's String na NSString.
elcuco
6
Ta odpowiedź działa w Xcode 7 beta 4 i Swift 2.0. Xcode teraz automatycznie uzupełnia metody Foundation na obiektach Swift String bez rzutowania typu na NSString, czego nie ma w Xcode 6.4 z Swift 1.2.
Andrew
1
Nie działało w REPL, dopóki nie zaimportowałem Foundation.
Velizar Hristov
1
Działa to dokładnie tak, jak oczekiwano (tzn. FullNameArr to an [String]) w Xcode 7.2.
Jon Cox
185

Najłatwiejszą metodą na to jest skorzystanie z componentsSeparatedBy:

W przypadku Swift 2:

import Foundation
let fullName : String = "First Last";
let fullNameArr : [String] = fullName.componentsSeparatedByString(" ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

W przypadku Swift 3:

import Foundation

let fullName : String = "First Last"
let fullNameArr : [String] = fullName.components(separatedBy: " ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]
Wyetro
źródło
Czy to jest gdziekolwiek udokumentowane, Maury? Co się stanie, jeśli będę musiał podzielić się na coś innego niż jedną postać?
NRitH
10
@NRitH rozważyć .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251
@ Crashalot są dwie funkcje: componentsSeparatedByStringicomponentsSeparatedByCharactersInSet
rmp251
131

Swift Dev. 4.0 (24 maja 2017 r.)

Nowa funkcja splitw Swift 4 ( Beta ).

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)

Wynik:

["Hello", "Swift", "4", "2017"]

Dostęp do wartości:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017

Xcode 8.1 / Swift 3.0.1

Oto sposób, w jaki wiele separatorów z tablicą.

import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)

Wynik:

["12", "37", "2", "5"]
LugiHaue
źródło
8
Dodaj import Foundationdo klasy, w której używasz tego. #SavedYouFiveMinutes
Adrian
4
Uwaga (Swift 4): Jeśli masz taki ciąg let a="a,,b,c"i używasz a.split(separator: ","), ["a", "b", c"]domyślnie dostajesz tablicę jak . Można to zmienić, używając omittingEmptySubsequences: falsedomyślnie true.
OderWat
2
Jakieś podziały wielu znaków w Swift 4+?
pkamb
57

Swift 4 lub nowszy

Jeśli potrzebujesz tylko poprawnie sformatować nazwisko osoby, możesz użyć PersonNameComponentsFormatter .

Klasa PersonNameComponentsFormatter zapewnia zlokalizowane reprezentacje składników imienia osoby, reprezentowane przez obiekt PersonNameComponents. Ta klasa służy do tworzenia zlokalizowanych nazwisk podczas wyświetlania użytkownikowi informacji o nazwisku osoby.


// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()

let name =  "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps  = nameFormatter.personNameComponents(from: name) {
    nameComps.namePrefix   // Mr.
    nameComps.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.

    // It can also be configured to format your names
    // Default (same as medium), short, long or abbreviated

    nameFormatter.style = .default
    nameFormatter.string(from: nameComps)   // "Steven Jobs"

    nameFormatter.style = .short
    nameFormatter.string(from: nameComps)   // "Steven"

    nameFormatter.style = .long
    nameFormatter.string(from: nameComps)   // "Mr. Steven Paul Jobs jr."

    nameFormatter.style = .abbreviated
    nameFormatter.string(from: nameComps)   // SJ

    // It can also be use to return an attributed string using annotatedString method
    nameFormatter.style = .long
    nameFormatter.annotatedString(from: nameComps)   // "Mr. Steven Paul Jobs jr."
}

wprowadź opis zdjęcia tutaj

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:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"
Leo Dabus
źródło
1
@DarrellRoot wystarczy zmapować podciągifullName.split { $0.isWhitespace }.map(String.init)
Leo Dabus
2
Uwielbiam ten nowy interfejs API, ale pamiętaj, że zwraca podciągi. Potrzebowałem napisów (i ogólnie chciałem podzielić się na białe znaki), więc zrobiłem to: 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.
Darrell Root
53

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:

let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["First", "Last"]

Korzystanie z wielu separatorów:

let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["Last", "First", "Middle"]
Antonio
źródło
2
Najbardziej użyteczne odpowiedź moim zdaniem, ponieważ może chcesz, aby umożliwić oddzielenie ciągów z ,lub ;lub inny separator
Chris
49

Szybki 4

let words = "these words will be elements in an array".components(separatedBy: " ")
Konstabl
źródło
34

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

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")

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ć, NSCharacterSetponieważ, 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

Zwraca zestaw znaków zawierający znaki z ogólnej kategorii Zs Unicode i TABULACJI ZNAKÓW (U + 0009).

let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
Cameron Lowell Palmer
źródło
2
Zgoda. Pierwszą rzeczą, która przyszła mi do głowy po obejrzeniu odpowiedzi podzielonych przez „” jest: Co się stanie, jeśli tekst wejściowy zawiera kilka kolejnych spacji? Co jeśli ma zakładki? Przestrzeń o pełnej szerokości (CJK)? itd.
Nicolas Miari
31

W Swift 4.2 i Xcode 10

//This is your str
let str = "This is my String" //Here replace with your string

opcja 1

let items = str.components(separatedBy: " ")//Here replase space with your value and the result is Array.
//Direct single line of code
//let items = "This is my String".components(separatedBy: " ")
let str1 = items[0]
let str2 = items[1]
let str3 = items[2]
let str4 = items[3]
//OutPut
print(items.count)
print(str1)
print(str2)
print(str3)
print(str4)
print(items.first!)
print(items.last!)

Opcja 2

let items = str.split(separator: " ")
let str1 = String(items.first!)
let str2 = String(items.last!)
//Output
print(items.count)
print(items)
print(str1)
print(str2)

Opcja 3

let arr = str.split {$0 == " "}
print(arr)

Opcja 4

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

Dokumentacja Apple ....

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", maxSplits: 1))//This can split your string into 2 parts
// Prints "["BLANCHE:", "  I don\'t want realism. I want magic!"]"

print(line.split(separator: " ", maxSplits: 2))//This can split your string into 3 parts

print(line.split(separator: " ", omittingEmptySubsequences: false))//array contains empty strings where spaces were repeated.
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", omittingEmptySubsequences: true))//array not contains empty strings where spaces were repeated.
print(line.split(separator: " ", maxSplits: 4, omittingEmptySubsequences: false))
print(line.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: true))
iOS
źródło
23

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ść”.

Jeroen Zonneveld
źródło
Zauważ, że to nie zwraca tablicy String, ale tablicy Substring, co jest niewygodne w użyciu.
Lirik
19

Aktualizacja do Swift 5 i najprostszy sposób

let paragraph = "Bob hit a ball, the hit BALL flew far after it was hit. Hello! Hie, How r u?"

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"])

To drukuje,

[„Bob”, „hit”, „a”, „ball”, „”, „the”, „hit”, „BALL”, „leciał”, „daleko”, „po”, „to”, „był” ”,„ hit ”,„ ”,„ Hello ”,„ ”,„ Hie ”,„ ”,„ How ”,„ r ”,„ u ”,„ ”

Jeśli jednak chcesz odfiltrować pusty ciąg,

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})

Wynik,

[„Bob”, „hit”, „a”, „piłka”, „the”, „hit”, „BALL”, „poleciał”, „daleko”, „po”, „to”, „był”, „ hit ”,„ Hello ”,„ Hie ”,„ How ”,„ r ”,„ u ”]

Ale upewnij się, że Fundacja została zaimportowana

Mithra Singam
źródło
17

Szybki 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Zwraca trzy struny AAA, BBBiCCC
  • Filtruje puste pola
  • Obsługuje wiele spacji i znaków tabulacji
  • Jeśli chcesz obsługiwać nowe linie, a następnie zastąpić .whitespacesz.whitespacesAndNewlines
tepl
źródło
15

Aktualizacja Swift 4, Xcode 10 i iOS 12 działa w 100%

let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullNameArr[1] //Last

Aby uzyskać więcej informacji, zobacz dokumentację Apple tutaj .

Xcodian Solangi
źródło
13

Xcode 8.0 / Swift 3

let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")

var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last

Długa droga:

var fullName: String = "First Last"
fullName += " " // this will help to see the last word

var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array

for Character in fullName.characters {
    if Character == " " {
        fullNameArr.append(newElement)
        newElement = ""
    } else {
        newElement += "\(Character)"
    }
}


var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last
NikaE
źródło
9

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:

let myArray = myString.components(separatedBy: .controlCharacters)
CodeBender
źródło
8

Znalazłem interesującą sprawę

metoda 1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

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

var data:[String] = featureData.split {$0 == "\u{003B}"}

metoda 2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

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

string.componentsSeparatedByString("")
Sruit A.Suk
źródło
1
Powiedziałbym, że jest to zbliżone do statusu „brak odpowiedzi”, ponieważ jest to głównie komentarz do istniejących odpowiedzi. Wskazuje jednak na coś ważnego.
rickster
8

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ę:

  • tabulatory / nowe linie / spacje (białe znaki), w tym powtarzające się znaki
  • wiodące / końcowe białe znaki
  • Znaki nowej linii Apple / Linux ( \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:

let searchInput = "  First \r\n \n \t\t\tMiddle    Last "
let searchTerms = searchInput 
    .replacingOccurrences(
        of: "\\s+",
        with: " ",
        options: .regularExpression
    )
    .trimmingCharacters(in: .whitespaces)
    .components(separatedBy: " ")

// searchTerms == ["First", "Middle", "Last"]
DonVaughn
źródło
6

Lub bez zamknięć możesz to zrobić w Swift 2:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
Rauli Rikama
źródło
6

Kroki dzielenia łańcucha na tablicę w Swift 4.

  1. przypisz ciąg
  2. na podstawie @ podziału.

Uwaga: zmiennaNazwa.komponenty (oddzielone przez: „podzielone słowo kluczowe”)

let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)
Vidhyapathi Kandhasamy
źródło
4

Szybki 4

let string = "loremipsum.dolorsant.amet:"

let result = string.components(separatedBy: ".")

print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")

Wynik

loremipsum
dolorsant
amet:
total: 3
MrMins
źródło
3

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:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
Parth Barot
źródło
3

Tylko splitpoprawna odpowiedź, oto różnica dla więcej niż 2 spacji.

var temp = "Hello world     ni hao"
let arr  = temp.components(separatedBy: .whitespacesAndNewlines)
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr2 = temp.components(separatedBy: " ")
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr3 = temp.split(whereSeparator: {$0 == " "})
// ["Hello", "world", "ni", "hao"]
mistdon
źródło
2
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)

Amr Lotfy
źródło
2

Dodano obsługę błędów Swift 2.2 i pisownię wielkimi literami:

func setFullName(fullName: String) {
    var fullNameComponents = fullName.componentsSeparatedByString(" ")

    self.fname = fullNameComponents.count > 0 ? fullNameComponents[0]: ""
    self.sname = fullNameComponents.count > 1 ? fullNameComponents[1]: ""

    self.fname = self.fname!.capitalizedString
    self.sname = self.sname!.capitalizedString
}
Aqib Mumtaz
źródło
2

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:

let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)

// Or if the enums do what you want, these are preferred. 
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)
possen
źródło
2

Szukałem luźnego podziału, takiego jak PHP, w explodektórym puste tablice są zawarte w wynikowej tablicy, to zadziałało dla mnie:

"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)

Wynik:

["First", ""]
AamirR
źródło
2

Daje to szereg bezpośrednio podzielonych części

var fullNameArr = fullName.components(separatedBy:" ")

możesz użyć w ten sposób,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Jodagama
źródło
1

Zmieniło się to ponownie w wersji Beta 5. Weee! Jest to teraz metoda na CollectionType

Stary:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}

Nowy:

var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}

Informacje o wydaniu jabłek

Daniel H.
źródło
1

Dla szybkiego 2, XCode 7.1:

let complete_string:String = "Hello world"
let string_arr =  complete_string.characters.split {$0 == " "}.map(String.init)
let hello:String = string_arr[0]
let world:String = string_arr[1]
abinop
źródło
1

Oto algorytm, który właśnie zbudowałem, który podzieli Stringdowolną Characterz tablicy, a jeśli zachodzi potrzeba zachowania podciągów za pomocą rozdzielonych znaków, można ustawić swallowparametr na true.

Xcode 7.3 - Swift 2.2:

extension String {

    func splitBy(characters: [Character], swallow: Bool = false) -> [String] {

        var substring = ""
        var array = [String]()
        var index = 0

        for character in self.characters {

            if let lastCharacter = substring.characters.last {

                // swallow same characters
                if lastCharacter == character {

                    substring.append(character)

                } else {

                    var shouldSplit = false

                    // check if we need to split already
                    for splitCharacter in characters {
                        // slit if the last character is from split characters or the current one
                        if character == splitCharacter || lastCharacter == splitCharacter {

                            shouldSplit = true
                            break
                        }
                    }

                    if shouldSplit {

                        array.append(substring)
                        substring = String(character)

                    } else /* swallow characters that do not equal any of the split characters */ {

                        substring.append(character)
                    }
                }
            } else /* should be the first iteration */ {

                substring.append(character)
            }

            index += 1

            // add last substring to the array
            if index == self.characters.count {

                array.append(substring)
            }
        }

        return array.filter {

            if swallow {

                return true

            } else {

                for splitCharacter in characters {

                    if $0.characters.contains(splitCharacter) {

                        return false
                    }
                }
                return true
            }
        }
    }
}

Przykład:

"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
DevAndArtist
źródło