2014-11-28 10 views
6

Sto provando a creare un'applicazione iOS in Swift che richiede di suddividere una riga di testo ai primi due punti (:) di una riga. Ho provato a utilizzare il metodo componentsSeparatedByString sulla stringa, ma oltre a ottenere un errore che indica che "'NSString' non ha un membro chiamato 'componentSeparatedByString'", quel metodo in realtà non fa ciò che voglio.Swift split string alla prima corrispondenza di un carattere

Per un po 'più di contesto, sto cercando di separare una linea in un gioco, che l'essere della forma

<character name> : <line> 

nel nome del personaggio e la linea. Suppongo che non ci siano due punti nel nome del personaggio, quindi voglio dividere i primi due punti della linea, in modo da non spezzare il testo della linea in pezzi se ci sono dei due punti nel testo.

Quindi, la mia prima domanda: perché l'uso di "componentsSeparatedByString" non è valido nel seguente codice: (il seguente codice non è la situazione che ho menzionato prima, ma è qualcosa che voglio sistemare e mantenere, così ho voluto usarlo al posto del codice rompere colon)

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

e il mio secondo:. Come posso dividere la stringa lungo solo la prima partita del colon (:) carattere, piuttosto che lungo tutte le partite?

risposta

6

il primo

E 'solo un errore di battitura, non componentSeparatedByString, ma componentsSeparatedByString

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

la seconda

È possibile utilizzare funzione built split che può specificare maxSplit:

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

Si noti che il tipo di risultato è [String]. Se si desidera [NSString], basta lanciarlo:

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

I * * fortemente ** consiglia di usare split, c'è un brutto problema quando si usano componentSeparatedByString su Swift 1.2. –

+1

@MauryMarkowitz, qual è il problema sgradevole? – Suragch

+0

@Suragch Non ricordo * esattamente *, ma si trattava di un problema di bridging che causava errori senza senso. L'ho solo debugato cambiando un'altra riga di codice e notando che non si bloccava anche se apparentemente stava facendo la stessa cosa. –

4

Swift 2 risposta con diviso funzione (ad Swift 3 uso maxsplit parametro S, basta aggiungere "s"):

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