2015-12-17 14 views
6

Ho una stringa che contiene parole e spazi, "2h 3m 1s". Voglio estrarre 2h da esso; quindi prendi tutto prima del primo spazio.Ottieni la prima parola in una stringa di parole e spazi - Sottostringa prima parola prima dello spazio

var date = "1,340d 1h 15m 52s" // I want to extract "1,340d". 

Qual è la migliore pratica per farlo? Quale funzione di sottostringa è l'approccio migliore?

+0

stringbytrimming personaggi –

+0

@UmaMadhavi Non voglio solo per sbarazzarsi di tutto ciò che è te spazi. Voglio ottenere i personaggi prima del primo spazio. – senty

+0

use (date.componentSeparatedByString ("") as! NSArray) [0] –

risposta

15

Se la stringa è pesante, componentsSeparatedByString() tende ad essere più veloce.

Swift 2:

var date = "1,340d 1h 15m 52s" 
if let first = date.componentsSeparatedByString(" ").first { 
    // Do something with the first component. 
} 

Swift 3/4:

if let first = date.components(separatedBy: " ").first { 
    // Do something with the first component. 
} 
+0

Un approccio migliore! Molte grazie! – senty

+0

Ottima risposta! Tieni presente che in questo esempio se la stringa della data è vuota, questo si bloccherà. Puoi fare il concatenamento opzionale per evitare questo. –

9

In questo contesto, né il metodo né il metodo characters.split(" ") sono il "metodo migliore" . Entrambi questi metodi attraversano l'intero oggetto String e danno come risultato un array String. Solo dopo che l'array è stato calcolato estraiamo la prima voce di questo array. Se stiamo trattando una stringa enorme, questo non è assolutamente necessario in questo contesto e si tradurrà in un inutile sovraccarico.

Invece, per una stringa enorme, il seguente metodo è quello di preferire:

let firstDateEntryFast = date.substringToIndex((date.rangeOfString(" ")?.first)!) 

Questo cercherà l'indice della prima occorrenza di " ", e successivamente restituire la sottostringa dall'inizio della stringa originale soltanto alla prima occorrenza. Ad esempio, non analizzerà mai né utilizzerà la stringa originale (in questo contesto: ipotizzata grande) oltre il punto della prima occorrenza " ".

Si noti tuttavia che a causa dello scostamento forzato (operatore (!)), Questo si bloccherà in fase di esecuzione se la stringa non contiene alcuna istanza di " ". Quindi, per stare al sicuro, e seguire la convenzione facoltativa di Swift, usarlo in una if let clausola:

if let myRange = date.rangeOfString(" ") { 
    let firstDateEntryFast = date.substringToIndex(myRange.first!) 
     // at this point, you know myRange is non-empty, and hence, .first can be 
     // force-unwrapped 
} 
else { 
    let firstDateEntryFast = date 
     // no " " separation, unexpected? -> action 
} 

Come nella mia prima versione della risposta, split può essere utilizzato come alternativa (paragonabile con componentsSeparatedByString):

var date = "1,340d 1h 15m 52s" 
let dateAsArray = date.characters.split(" ").map{ String($0) } 
let firstDateEntry = dateAsArray[0] 

alternativa, saltare tutti memorizzazione in un array e direttamente ottenere la prima voce

var date = "1,340d 1h 15m 52s" 
let firstDateEntryDirectly = String(date.characters.split(" ")[0]) 
+0

Ace thanksss ... – senty

2

Usa sotto il codice per il vostro requisito

var date = "1,340d 1h 15m 52s" 
print((date.componentsSeparatedByString(" ") as NSArray).objectAtIndex(0)); 
1

Swift 3 versione

var str = "Hello, playground one two three" 
let firstWord = str.components(separatedBy: " ").first 
Problemi correlati