Einen String in Swift in ein Array teilen?

686

Angenommen, ich habe hier eine Zeichenfolge:

var fullName: String = "First Last"

Ich möchte die Zeichenfolgenbasis auf Leerzeichen aufteilen und die Werte ihren jeweiligen Variablen zuweisen

var fullNameArr = // something like: fullName.explode(" ") 

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

Manchmal haben Benutzer auch keinen Nachnamen.

blee908
quelle
13
Hallo, ich habe meinen Mac nicht zum Überprüfen. Sie können jedoch 'fullName.componentsSeparatedByString (string: "")' ausprobieren. Kopieren Sie nicht und fügen Sie es ein. Verwenden Sie die Autovervollständigungsfunktion, damit Sie die richtige Funktion erhalten.
David Gölzhäuser
Wenn Sie nur Splitting um ein Zeichen sind, mit fullName.utf8.split( <utf-8 character code> )Werken wie auch (ersetzen .utf8mit .utf16UTF-16). Zum Beispiel +könnte das Aufteilen mitfullName.utf8.split(43)
Jojodmo
Manchmal haben Nachnamen auch Leerzeichen, wie in "Daphne du Maurier" oder "Charles de Lint"
Berry

Antworten:

784

Der schnelle Weg besteht darin, die globale splitFunktion wie folgt zu verwenden :

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

mit Swift 2

In Swift 2 wird die Verwendung von Split aufgrund der Einführung des internen CharacterView-Typs etwas komplizierter. Dies bedeutet, dass String die Protokolle SequenceType oder CollectionType nicht mehr übernimmt und Sie stattdessen die .charactersEigenschaft verwenden müssen, um auf eine CharacterView-Typdarstellung einer String-Instanz zuzugreifen. (Hinweis: CharacterView verwendet die Protokolle SequenceType und 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
quelle
98
In meinen Tests ist componentsSeparatedByString normalerweise erheblich schneller, insbesondere wenn es sich um Zeichenfolgen handelt, die in viele Teile geteilt werden müssen. Für das vom OP aufgeführte Beispiel sollte jedoch beides ausreichen.
Casey Perkins
9
Ab Xcode 6.2b3 kann Split als verwendet werden split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false).
Pascal
14
Denken Sie daran, dass Sie immer noch die alte componentsSeparatedByString()Methode verwenden müssen, wenn Ihr Trennzeichen länger als ein einzelnes Zeichen ist. Und so cool es auch sein let (firstName, lastName) = split(fullName) {$0 == ' '}mag, das funktioniert leider nicht.
NRitH
3
@ Kashif dann könnten Sie verwenden split("a,b;c,d") {$0 == "," || $0 == ";"}odersplit("a,b;c,d") {contains(",;", $0)}
Ethan
4
Der korrekte Code für Xcode 7.0 lautet fullNameArr = fullName.characters.split {$ 0 == ""} .map (String.init). Versucht zu bearbeiten, aber es wurde abgelehnt.
Skagedal
1015

Rufen componentsSeparatedByStringSie einfach die Methode auf IhremfullName

import Foundation

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

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

Update für Swift 3+

import Foundation

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

let name    = fullNameArr[0]
let surname = fullNameArr[1]
Chen-Tsu Lin
quelle
3
Beachten Sie, dass dies tatsächlich ein Basiswert ist NSString(Swift tauscht sie beim Import automatisch aus Foundation).
Kann
1
Dies ist in Swift 1.2 nicht mehr der Fall, in dem Apple Swifts String nicht mehr automatisch in NSString konvertiert.
Elcuco
6
Diese Antwort funktioniert in Xcode 7 Beta 4 und Swift 2.0. Xcode vervollständigt jetzt automatisch Foundation-Methoden für Swift String-Objekte, ohne dass ein Typ in einen NSString umgewandelt wird, was in Xcode 6.4 mit Swift 1.2 nicht der Fall ist.
Andrew
1
In der REPL hat es nicht funktioniert, bis ich Foundation importiert habe.
Velizar Hristov
1
Dies funktioniert genau wie erwartet (dh fullNameArr ist ein [String]) in Xcode 7.2.
Jon Cox
185

Die einfachste Methode hierfür ist die Verwendung von componentsSeparatedBy:

Für 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]

Für 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
quelle
Ist das irgendwo dokumentiert, Maury? Was ist, wenn ich mich auf etwas anderes als einen einzelnen Charakter aufteilen muss?
NRitH
10
@NRitH betrachten .componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
rmp251
@Crashalot gibt es zwei Funktionen: componentsSeparatedByStringundcomponentsSeparatedByCharactersInSet
rmp251
130

Swift Dev. 4,0 (24. Mai 2017)

Eine neue Funktion splitin Swift 4 ( Beta ).

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

Ausgabe:

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

Zugriff auf Werte:

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

Xcode 8.1 / Swift 3.0.1

Hier ist die Art und Weise mehrere Trennzeichen mit Array.

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

Ausgabe:

["12", "37", "2", "5"]
LugiHaue
quelle
8
import FoundationStellen Sie sicher, dass Sie der Klasse hinzufügen, in der Sie dies verwenden. #SavedYouFiveMinutes
Adrian
4
Achtung (Swift 4): Wenn Sie eine Zeichenfolge wie let a="a,,b,c"und verwenden, erhalten a.split(separator: ",")Sie ["a", "b", c"]standardmäßig ein Array wie . Dies kann geändert werden omittingEmptySubsequences: false, indem standardmäßig true verwendet wird.
OderWat
2
Gibt es in Swift 4+ mehrere Zeichen?
pkamb
57

Swift 4 oder höher

Wenn Sie nur einen Personennamen richtig formatieren müssen, können Sie PersonNameComponentsFormatter verwenden .

Die PersonNameComponentsFormatter-Klasse bietet lokalisierte Darstellungen der Komponenten des Namens einer Person, wie sie durch ein PersonNameComponents-Objekt dargestellt werden. Verwenden Sie diese Klasse, um lokalisierte Namen zu erstellen, wenn dem Benutzer Informationen zum Personennamen angezeigt werden.


// 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."
}

Geben Sie hier die Bildbeschreibung ein

bearbeiten / aktualisieren:

Swift 5 oder höher

Um eine Zeichenfolge nur durch Nicht-Buchstaben-Zeichen zu teilen, können Sie die neue Character-Eigenschaft verwenden isLetter:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"
Leo Dabus
quelle
1
@DarrellRoot Sie müssen nur die fullName.split { $0.isWhitespace }.map(String.init)
Teilzeichenfolgen zuordnen
2
Ich liebe diese neue API, aber denke daran, dass sie Teilzeichenfolgen zurückgibt. Ich brauchte Strings (und wollte mich generell auf Leerzeichen aufteilen), also tat ich let words = line.split{ $0.isWhitespace }.map{ String($0)} Folgendes : Danke @LeoDabus für Ihre Version (in meinem ursprünglichen Kommentar fehlte Code). Außerdem schlage ich vor, die Swift 5-Version an den Anfang der Antwort zu verschieben.
Darrell Root
53

Als Alternative zur Antwort von WMios können Sie auch verwenden componentsSeparatedByCharactersInSet, was nützlich sein kann, wenn Sie mehr Trennzeichen (Leerzeichen, Komma usw.) haben.

Mit Ihrer spezifischen Eingabe:

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

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

Verwenden mehrerer Trennzeichen:

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

// words contains ["Last", "First", "Middle"]
Antonio
quelle
2
Am nützlichsten Antwort meiner Ansicht nach , da Sie Trennung von Zeichenkette ermöglichen , mögen vielleicht mit ,oder ;oder anderem Separator
Chris
49

Swift 4

let words = "these words will be elements in an array".components(separatedBy: " ")
Bobby
quelle
34

Das Whitespace-Problem

Im Allgemeinen erfinden die Menschen dieses Problem und schlechte Lösungen immer wieder neu. Ist das ein Raum? "" und was ist mit "\ n", "\ t" oder einem Unicode-Leerzeichen, das Sie noch nie gesehen haben, nicht zuletzt, weil es unsichtbar ist. Während Sie mit durchkommen können

Eine schwache Lösung

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

Wenn Sie jemals die Realität in den Griff bekommen müssen, schauen Sie sich ein WWDC-Video mit Zeichenfolgen oder Daten an. Kurz gesagt, es ist fast immer besser, Apple zu erlauben, diese Art von weltlicher Aufgabe zu lösen.

Robuste Lösung: Verwenden Sie NSCharacterSet

Der Weg, dies richtig zu machen, IMHO, ist zu verwenden, NSCharacterSetda, wie bereits erwähnt, Ihr Leerzeichen möglicherweise nicht Ihren Erwartungen entspricht und Apple einen Leerzeichen-Zeichensatz bereitgestellt hat. Informationen zu den verschiedenen bereitgestellten Zeichensätzen finden Sie in der Entwicklerdokumentation zu NSCharacterSet von Apple. Erweitern oder erstellen Sie erst dann einen neuen Zeichensatz, wenn er nicht Ihren Anforderungen entspricht.

NSCharacterSet Whitespaces

Gibt einen Zeichensatz zurück, der die Zeichen in Unicode General Category Zs und CHARACTER TABULATION (U + 0009) enthält.

let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
Cameron Lowell Palmer
quelle
2
Einverstanden. Das erste, was mir einfiel, nachdem ich die Antworten gesehen hatte, die durch "" geteilt wurden, ist: Was passiert, wenn der Eingabetext mehrere aufeinanderfolgende Leerzeichen enthält? Was ist, wenn es Tabs hat? Raum in voller Breite (CJK)? usw.
Nicolas Miari
31

In Swift 4.2 und Xcode 10

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

Option 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!)

Option 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)

Option 3

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

Option 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!"]"

Von Apple Documentation ....

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
quelle
23

Swift 4 erleichtert das Teilen von Zeichen erheblich. Verwenden Sie einfach die neue Funktion zum Teilen von Zeichenfolgen.

Beispiel: let s = "hi, hello" let a = s.split(separator: ",") print(a)

Jetzt hast du ein Array mit 'hi' und 'hallo'.

Jeroen Zonneveld
quelle
Beachten Sie, dass dies kein Array von String zurückgibt, sondern ein Array von Substring, dessen Verwendung umständlich ist.
Lirik
19

Update für Swift 5 und der einfachste Weg

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: [",", " ", "!",".","?"])

Dies druckt,

["Bob", "Treffer", "ein", "Ball", "", "der", "Treffer", "BALL", "flog", "weit", "nach", "es", "war "," hit "," "," Hello "," "," Hie "," "," How "," r "," u "," "]

Wenn Sie jedoch eine leere Zeichenfolge herausfiltern möchten,

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

Ausgabe,

["Bob", "Treffer", "ein", "Ball", "der", "Treffer", "BALL", "flog", "weit", "nach", "es", "war", " drücke "," Hallo "," Hie "," Wie "," r "," u "]

Stellen Sie jedoch sicher, dass Foundation importiert wird

Mithra Singam
quelle
17

Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Gibt drei Saiten AAA, BBBundCCC
  • Filtert leere Felder heraus
  • Behandelt mehrere Leerzeichen und Tabellierungszeichen
  • Wenn Sie neue Zeilen verarbeiten möchten, ersetzen Sie diese .whitespacesdurch.whitespacesAndNewlines
tepl
quelle
15

Swift 4, Xcode 10 und iOS 12 Update funktionieren zu 100%

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

Weitere Informationen finden Sie in der Apple-Dokumentation .

Xcodian Solangi
quelle
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

Langer Weg:

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
quelle
9

Ich hatte ein Szenario, in dem mehrere Steuerzeichen in der Zeichenfolge vorhanden sein können, die ich teilen möchte. Anstatt ein Array davon zu pflegen, lasse ich Apple nur diesen Teil erledigen.

Folgendes funktioniert mit Swift 3.0.1 unter iOS 10:

let myArray = myString.components(separatedBy: .controlCharacters)
CodeBender
quelle
8

Ich habe einen interessanten Fall gefunden

Methode 1

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

Als ich diesen Befehl verwendet habe, um ein Symbol von den vom Server geladenen Daten zu trennen , kann es während des Tests im Simulator geteilt und mit dem Testgerät synchronisiert werden, aber nicht in der Veröffentlichungs-App und Ad-hoc

Ich brauche viel Zeit, um diesen Fehler zu verfolgen. Er könnte von einer Swift-Version oder einer iOS-Version oder von keiner verflucht sein

Es geht auch nicht um den HTML-Code, da ich versuche, stringByRemovingPercentEncoding zu verwenden, und es immer noch nicht funktioniert

Ergänzung 10.10.2015

In Swift 2.0 wurde diese Methode geändert

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

Methode 2

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

Wenn ich diesen Befehl verwendet habe, kann er dieselben Daten aufteilen, die vom Server korrekt geladen wurden


Fazit, ich schlage wirklich vor, die Methode 2 zu verwenden

string.componentsSeparatedByString("")
Obst A.Suk
quelle
1
Ich würde sagen, dass dies dem Status "keine Antwort" nahe kommt, da es sich hauptsächlich um Kommentare zu vorhandenen Antworten handelt. Aber es weist auf etwas Wichtiges hin.
Rickster
8

Die meisten dieser Antworten übernehmen die Eingabe ein Leerzeichen enthält - nicht weiß Raum, und einen einzigen Raum dazu. Wenn Sie diese Annahme sicher treffen können, dann ist die akzeptierte Antwort (von bennett) ziemlich elegant und auch die Methode, mit der ich gehen werde, wenn ich kann.

Wenn wir diese Annahme nicht treffen können, muss eine robustere Lösung die folgenden Situationen abdecken, die die meisten Antworten hier nicht berücksichtigen:

  • Tabulatoren / Zeilenumbrüche / Leerzeichen (Leerzeichen), einschließlich wiederkehrender Zeichen
  • führendes / nachfolgendes Leerzeichen
  • Apple / Linux (\n ) und Windows ( \r\n) Zeilenumbruchzeichen

Um diese Fälle abzudecken, verwendet diese Lösung Regex, um alle Leerzeichen (einschließlich wiederkehrender und Windows-Zeilenumbruchzeichen) in ein einzelnes Leerzeichen zu konvertieren, zu schneiden und dann durch ein einzelnes Leerzeichen zu teilen:

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
quelle
6

Oder ohne Verschlüsse können Sie genau dies in Swift 2 tun:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
Rauli Rikama
quelle
6

Schritte zum Aufteilen eines Strings in ein Array in Swift 4.

  1. Zeichenfolge zuweisen
  2. basierend auf @ split.

Hinweis: variableName.components (separateBy: "split keyword")

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
quelle
4

Swift 4

let string = "loremipsum.dolorsant.amet:"

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

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

Ausgabe

loremipsum
dolorsant
amet:
total: 3
MrMins
quelle
3

Angenommen, Sie haben eine Variable mit dem Namen "Hello World". Wenn Sie sie aufteilen und in zwei verschiedene Variablen speichern möchten, können Sie sie folgendermaßen verwenden:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
Parth Barot
quelle
2
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)

Amr Lotfy
quelle
2

Swift 2.2 Fehlerbehandlung & großgeschriebener String Hinzugefügt:

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
quelle
2

Die Handhabung von Zeichenfolgen ist in Swift immer noch eine Herausforderung und ändert sich erheblich, wie Sie anhand anderer Antworten sehen können. Hoffentlich beruhigen sich die Dinge und es wird einfacher. Dies ist der Weg mit der aktuellen Version 3.0 von Swift mit mehreren Trennzeichen.

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
quelle
2

Ich suchte nach einem lockeren Split, wie z. B. PHPs , bei explodedenen leere Sequenzen im resultierenden Array enthalten sind. Dies funktionierte für mich:

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

Ausgabe:

["First", ""]
AamirR
quelle
2

Dies ergibt eine Reihe von geteilten Teilen direkt

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

dann kannst du so verwenden,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
Yodagama
quelle
2

Nur das splitist die richtige Antwort, hier ist der Unterschied für mehr als 2 Leerzeichen.

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
quelle
1

Dies hat sich in Beta 5 erneut geändert. Weee! Es ist jetzt eine Methode für CollectionType

Alt:

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

Neu:

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

Versionshinweise zu Äpfeln

Daniel H.
quelle
1

Für Swift 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
quelle
1

Hier ist ein Algorithmus, den ich gerade erstellt habe, der a Stringdurch einen beliebigen Teil Characterdes Arrays aufteilt. Wenn Sie die Teilzeichenfolgen mit geteilten Zeichen behalten möchten, können Sie den swallowParameter auf setzentrue .

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
            }
        }
    }
}

Beispiel:

"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
DevAndArtist
quelle