2014-11-28 7 views
6

Ich versuche, eine iOS-App in Swift, die mich eine Zeile Text auf den ersten Doppelpunkt (:) einer Zeile teilen müssen. Ich habe versucht, die componentsSeparatedByString-Methode für die Zeichenfolge zu verwenden, aber zusätzlich zu dem Fehler "NSString hat kein Mitglied mit dem Namen" componentSeparatedByString "" erhalten, tut diese Methode nicht wirklich, was ich will.Swift Split String bei der ersten Übereinstimmung eines Zeichens

Für ein bisschen mehr Kontext, ich versuche, eine Linie in einem Theaterstück zu trennen, das Wesen der Form

<character name> : <line> 

in den Namen des Charakters und der Linie. Ich gehe davon aus, dass im Namen des Charakters kein Doppelpunkt vorhanden ist. Daher möchte ich den ersten Doppelpunkt in der Zeile aufteilen, damit der Text der Zeile nicht in Teile zerlegt wird, wenn der Text Doppelpunkte enthält.

Also, meine erste Frage: Warum ist die Verwendung von 'componentsSeparatedByString' im folgenden Code nicht gültig: (Der folgende Code ist nicht die Situation, die ich zuvor erwähnte, aber es ist etwas, das ich beheben und behalten möchte, so wollte ich es anstelle des Dickdarms zu brechen Code verwenden)

var fileRoot = NSBundle.mainBundle().pathForResource("LonelyImpulse", ofType: "txt") 
    var contents = NSString(contentsOfFile:fileRoot!, encoding: NSUTF8StringEncoding, error: nil)! 
    let stringArray = contents.componentSeparatedByString("\n") 

Und meine zweite. Wie kann ich die Zeichenfolge geteilt entlang nur das erste Spiel der Doppelpunkt (:) Zeichen, anstatt entlang aller Spiele?

Antwort

6

ersten

Es ist nur ein Tippfehler, nicht componentSeparatedByString, aber componentsSeparatedByString

let stringArray = contents.componentsSeparatedByString("\n") 
//        ^

kann die zweite

Sie builtin split Funktion verwenden, die maxSplit angeben:

let str:NSString = "test:foo:bar" 
let result = split(str as String, { $0 == ":" }, maxSplit: 1, allowEmptySlices: true) 
// -> ["test", "foo:bar"] 

Beachten Sie, dass der Typ des Ergebnisses [String] ist. Wenn Sie [NSString] wollen, ist es nur Stimmen:

let result:[NSString] = split(string as String, { $0 == ":" }, maxSplit: 1, allowEmptySlices: true) 
//  ^^^^^^^^^^^ 
+0

I * * stark ** empfehle die Verwendung von Split, es gibt ein unangenehmes Problem bei der Verwendung von ComponentsSeparatedByString auf Swift 1.2. –

+1

@MauryMarkowitz, was ist das böse Problem? – Suragch

+0

@Suragh Ich erinnere mich nicht * genau *, aber es war ein Überbrückungsproblem, das unsinnige Fehler verursachte. Ich debuggte nur, indem ich eine andere Codezeile änderte und merkte, dass es nicht abstürzte, obwohl es anscheinend dasselbe tat. –

4

Swift 2 Antwort mit geteilt Funktion (für Swift 3 Verwendung maxSplit S Parameter, fügen Sie einfach "s"):

let fullString = "A B C" 
let splittedStringsArray = fullString.characters.split(" ", maxSplit: 1).map(String.init) 
print(splittedStringsArray) // ["A","B C"] 
Verwandte Themen