2014-11-28 18 views
6

Próbuję stworzyć aplikację dla systemu iOS w Swift, która wymaga podziału wiersza tekstu na pierwszym dwukropku (:) linii. Próbowałem już używać metody componentsSeparatedByString w łańcuchu, ale oprócz otrzymania błędu stwierdzającego, że "NSString" nie ma członka o nazwie "componentSeparatedByString" ", ta metoda faktycznie nie robi tego, co chcę.Swift split string przy pierwszym dopasowaniu postaci

Dla nieco więcej kontekstu, staram się oddzielić linię w sztuce, że bycie w formie

<character name> : <line> 

pod nazwą bohatera i linii. Zakładam, że w nazwie postaci nie ma dwukropka, więc chcę podzielić na pierwszą dwukropek w linii, aby nie rozbijać tekstu linii na kawałki, jeśli w tekście są jakieś dwukropki.

Moje pierwsze pytanie: Dlaczego użycie "componentsSeparatedByString" nie jest poprawne w poniższym kodzie: (poniższy kod nie jest sytuacją, o której wspomniałem wcześniej, ale jest to coś, co chcę naprawić i zachować, więc chciałem go używać zamiast dwukropka kodu zerwania)

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

i mój drugi. w jaki sposób można podzielić ciąg wzdłuż tylko w pierwszym meczu z dwukropkiem (:) znaków, zamiast wzdłuż wszystkich meczów?

Odpowiedz

6

pierwszej

To tylko literówka, nie componentSeparatedByString, ale componentsSeparatedByString

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

drugi

Można użyć wbudowanego split funkcję, którą można określić maxSplit:

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

Należy pamiętać, że typ wyniku to [String]. Jeśli chcesz [NSString], po prostu rzucić go:

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

I * * zdecydowanie ** polecam przy użyciu podziału, jest nieprzyjemny problem podczas korzystania z componentsSeparatedByString na Swift 1.2. –

+1

@MauryMarkowitz, jaki jest nieprzyjemny problem? – Suragch

+0

@Suragch Nie pamiętam * dokładnie *, ale był to problem pomostowy, który powodował błędy. Jedynie debugowałem go, zmieniając kolejną linię kodu i zauważając, że się nie zawiesił, chociaż podobno to robiło to samo. –

4

Swift 2 Odpowiedź z podzielić funkcję (Swift 3 Użyj maxSplit S parametr, po prostu dodaj "S"):

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