it-swarm.com.de

Einen String in ein Array in Swift aufteilen?

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.

632
blee908

Die Swift Methode besteht darin, die globale split Funktion 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 Eigenschaft .characters 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 
754
Ethan

Rufen Sie einfach die Methode componentsSeparatedByString auf Ihrem fullName auf.

import Foundation

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

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

pdate für Swift 3 +

import Foundation

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

let name    = fullNameArr[0]
let surname = fullNameArr[1]
960
Chen-Tsu Lin

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]
170
Wyetro

Swift Dev. 4.0 (24. Mai 2017)

Eine neue Funktion split in 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 der Weg 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"]
110
LugiHaue

Alternativ zur Antwort von WMios können Sie auch componentsSeparatedByCharactersInSet verwenden. Dies kann nützlich sein, wenn Sie mehrere Trennzeichen (Leerzeichen, Komma usw.) verwenden.

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"]
50
Antonio

Swift 4 oder höher

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

Die PersonNameComponentsFormatter-Klasse stellt lokalisierte Darstellungen der Komponenten des Namens einer Person bereit, wie sie durch ein PersonNameComponents-Objekt dargestellt werden. Verwenden Sie diese Klasse, um lokalisierte Namen zu erstellen, wenn dem Benutzer Personennameninformationen 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."
}

enter image description here

bearbeiten/aktualisieren:

Swift 5 oder höher

Um einen String nur durch Nichtbuchstaben zu teilen, können wir die neue Character-Eigenschaft isLetter verwenden:

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"
49
Leo Dabus

Swift 4

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

Das Whitespace-Problem

Im Allgemeinen erfinden die Leute dieses Problem und die schlechten 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öchten, schauen Sie sich ein WWDC-Video zu Streichern 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

Die Methode, um dies korrekt durchzuführen, besteht IMHO darin, NSCharacterSet zu verwenden, da Ihr Whitespace, wie bereits erwähnt, möglicherweise nicht Ihren Erwartungen entspricht und Apple einen Whitespace-Zeichensatz bereitgestellt hat. Informationen zu den verschiedenen bereitgestellten Zeichensätzen finden Sie in der Apple-Dokumentation NSCharacterSet-Entwicklerdokumentation . Erweitern oder erstellen Sie dann einen neuen Zeichensatz, wenn dieser nicht Ihren Anforderungen entspricht.

NSCharacterSet Leerzeichen

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

Nach Apple Dokumentation ....

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))
26
iOS

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 'hello'.

21

Swift

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • Gibt drei Zeichenfolgen zurück AAA, BBB und CCC
  • Filtert leere Felder aus
  • Verarbeitet mehrere Leerzeichen und Tabellierungszeichen
  • Wenn Sie mit neuen Zeilen umgehen möchten, ersetzen Sie .whitespaces durch .whitespacesAndNewlines
16
tepl

Xcode 8.0/Swift

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
13
NikaE

Swift 4, Xcode 10 und iOS 12 Update 100% funktioniert

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 Dokumentation von Apple hier .

11
Xcodian Solangi

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

Das Folgende funktioniert mit Swift 3.0.1 unter iOS 10:

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

Ich habe einen interessanten Fall gefunden

Methode 1

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

Wenn ich diesen Befehl verwendet habe, um ein Symbol zu teilen von den Daten, die vom Server geladen wurden, kann es beim Testen im Simulator und bei der Synchronisierung mit dem Testgerät geteilt werden, aber es wird nicht in Publish App und Ad Hoc geteilt

Ich brauche viel Zeit, um diesen Fehler aufzuspüren. Es kann sein, dass er von einer Swift -Version oder einer iOS-Version oder keiner von beiden stammt

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

Ergänzung 10.10.2015

in Swift 2.0 wurde diese Methode in geändert

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

Methode 2

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

Als ich diesen Befehl verwendet habe, kann die gleichen Daten aufteilen, die vom Server korrekt geladen wurden


Fazit, ich empfehle wirklich die Methode 2

string.componentsSeparatedByString("")
8
Sruit A.Suk

Update für Swift 5 und einfache Art und Weise

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

Dieses druckt,

["Bob", "hit", "a", "ball", "the", "hit", "ball", "fly", "far", "after", "it", "was" "," 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", "hit", "a", "ball", "the", "hit", "ball", "fly", "far", "after", "it", "was", " drücke "," Hallo "," Hie "," Wie "," r "," u "]

Aber stellen Sie sicher, dass Foundation importiert wird

7
Mithra Singam

Die meisten dieser Antworten gehen davon aus, dass die Eingabe ein Leerzeichen enthält - nicht weiß Leerzeichen und ein einzelnes Leerzeichen. 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 (Whitespace), einschließlich wiederkehrende Zeichen
  • führende/nachfolgende Leerzeichen
  • Apple/Linux (\n) nd Windows (\r\n) Newline-Zeichen

Um diese Fälle abzudecken, konvertiert diese Lösung mithilfe von Regex alle Leerzeichen (einschließlich wiederkehrender und Windows-Zeilenumbrüche) in ein einzelnes Leerzeichen, schneidet sie ab und teilt sie dann durch ein einzelnes Leerzeichen auf:

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"]
7
DonVaughn

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

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

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

  1. zeichenfolge zuweisen
  2. basierend auf @ splitting.

Anmerkung: variableName.components (SeparatedBy: "Schlüsselwort aufteilen")

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)

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

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
3
Parth Barot

Swift 2.2Fehlerbehandlung & Großbuchstaben 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
}
2
Aqib Mumtaz
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68)

2
Amr Lotfy

Ich habe nach einer lockeren Aufteilung gesucht, z. B. nach explode von PHP, bei der leere Sequenzen in das resultierende Array einbezogen werden. Das hat bei mir funktioniert:

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

Ausgabe:

["First", ""]
2
AamirR

Die Handhabung von Zeichenfolgen ist in Swift immer noch eine Herausforderung und ändert sich ständig erheblich, wie Sie aus anderen Antworten ersehen können. Hoffentlich beruhigen sich die Dinge und es wird einfacher. Dies ist der Weg, um dies mit der aktuellen 3.0-Version von Swift mit mehreren Trennzeichen zu tun.

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)
2
possen

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]
1
abinop

Hier ist ein gerade erstellter Algorithmus, der String durch einen beliebigen Character aus dem Array aufteilt. Wenn Sie die Teilzeichenfolgen mit aufgeteilten Zeichen beibehalten möchten, können Sie den Parameter swallow festlegen zu 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
            }
        }
    }
}

Beispiel:

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

Swift 5 und höher

let fullString = "Last First Middle"
let fullNameArr = fullString.components(separatedBy: " ")
1
midhun p

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

1
Daniel H.

Ich habe keine Lösung gefunden, die Namen mit 3 oder mehr Komponenten unterstützt und ältere iOS-Versionen unterstützt.

struct NameComponentsSplitter {

    static func split(fullName: String) -> (String?, String?) {
        guard !fullName.isEmpty else {
            return (nil, nil)
        }
        let components = fullName.components(separatedBy: .whitespacesAndNewlines)
        let lastName = components.last
        let firstName = components.dropLast().joined(separator: " ")
        return (firstName.isEmpty ? nil : firstName, lastName)
    }
}

Bestandene Testfälle:

func testThatItHandlesTwoComponents() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Smith")
    XCTAssertEqual(firstName, "John")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesMoreThanTwoComponents() {
    var (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Smith")
    XCTAssertEqual(firstName, "John Clark")
    XCTAssertEqual(lastName, "Smith")

    (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Jr. Smith")
    XCTAssertEqual(firstName, "John Clark Jr.")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesEmptyInput() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "")
    XCTAssertEqual(firstName, nil)
    XCTAssertEqual(lastName, nil)
}
0
Vadim Bulavin

Gemäß Swift 2.2

Sie schreiben nur 2 Zeilen Code und Sie erhalten die geteilte Zeichenfolge.

let fullName = "FirstName LastName"
var splitedFullName = fullName.componentsSeparatedByString(" ")
print(splitedFullName[0])
print(splitedFullName[1]) 

Genießen. :)

0
Gautam Sareriya
var fullName = "James Keagan Michael"
let first = fullName.components(separatedBy: " ").first?.isEmpty == false ? fullName.components(separatedBy: " ").first! : "John"
let last =  fullName.components(separatedBy: " ").last?.isEmpty == false && fullName.components(separatedBy: " ").last != fullName.components(separatedBy: " ").first ? fullName.components(separatedBy: " ").last! : "Doe"
  • Gleichen Vor- und Nachnamen nicht zulassen
  • Wenn ein vollständiger Name ungültig ist, nehmen Sie den Platzhalterwert "John Doe"
0
jnblanchard