2015-02-24 13 views
7

Sto imparando veloce. Ho provato questo in Playground. Non ho idea del motivo per cui la stringa non viene mai scritta in maiuscolo qui. O c'è un altro modo per capitalizzare direttamente la stringa all'interno della matrice?Come posso capitalizzare direttamente tutte le stringhe all'interno di un array?

Ecco il mio codice.

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 

for index in 0..<dogNames.count { 
    var dogName = dogNames[index].capitalizedString 
    dogNames.removeAtIndex(index) 
    dogNames.append(dogName) 
} 

Quando si tenta di visualizzare nuovamente la variabile dogNames. Le stringhe all'interno non vengono maiuscole.

+0

È possibile sostituire direttamente dogNames [index] = somethingelse nel ciclo for –

risposta

2

Per rispondere alla mia stessa domanda. Riassumendo tutto ciò che ho trovato nelle risposte qui. Ho trovato questa soluzione. Questo è quello che ho fatto per risolvere questo problema con meno processi.

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 


for index in 0..<dogNames.count { 

    if dogNames[index] != dogNames[index].capitalizedString { 
     var dogName = dogNames[index].capitalizedString 
     dogNames[index] = dogName 
    } 

} 
+0

Felice che tu possa capirlo. –

2

Rimuovendo dal centro dell'array e quindi aggiungendo fino alla fine, si finisce per saltare alcuni elementi. Ecco ciò che l'array assomiglia ad ogni passo:

[Sean, fido, Sarah, Parker, Walt, abby, Yang] 
[fido, Sarah, Parker, Walt, abby, Yang, Sean] (index=0; Sean moved to end) 
[fido, Parker, Walt, abby, Yang, Sean, Sarah] (index=1; Sarah moved to end) 
[fido, Parker, abby, Yang, Sean, Sarah, Walt] (index=2; Walt moved to end) 
[fido, Parker, abby, Sean, Sarah, Walt, Yang] 
[fido, Parker, abby, Sean, Walt, Yang, Sarah] 
[fido, Parker, abby, Sean, Walt, Sarah, Yang] 
[fido, Parker, abby, Sean, Walt, Sarah, Yang] 

Se si desidera mantenere intatta la matrice, che avrebbe più senso di sostituire allo stesso indice che hai preso da:

dogNames[index] = dogName 

Ma si può fare questo più elegantemente utilizzando Array.map per elaborare ogni elemento in modo indipendente, e non avere a che fare con gli indici a tutti:

let dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 
    let capitalDogNames = dogNames.map({ (dogName) -> String in 
     return dogName.capitalizedString 
    }) 
+0

Oh capisco. Capisco! Sono così zoppo. Cosa dovrei fare invece? Voglio solo in maiuscolo ogni stringa. – Rhenz

+0

Questa è una chiusura giusta? – Rhenz

+0

Sì. La funzione 'map' prende una chiusura e la applica a ogni elemento in una matrice e fornisce una matrice del risultato. È un po 'schizzinoso su quale tipo di chiusura accetta. Devi specificare il valore di ritorno per ciascun elemento: in questo caso 'String'. – Phssthpok

1

Usa .uppercaseString di capitalizzare tutti i caratteri.

3

tenta di utilizzare seguente codice:

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 

for index in 0..<dogNames.count { 
    var dogName = dogNames[index].capitalizedString 
    dogNames[index]=dogName 
} 

uscita:

[Sean, Fido, Sarah, Parker, Walt, Abby, Yang]

+0

Sì, ha funzionato. Sono così zoppo che non ho visto a causa della rimozione di un oggetto, alcuni elementi vengono saltati. Comunque c'è anche un modo per controllare la stringa se è già in maiuscolo in modo che possa ridurre il processo? – Rhenz

+0

devi controllare il carattere con 'NSCharacterSet.uppercaseLetterCharacterSet()' –

1

È necessario eseguire il ciclo in ordine inverso:

for index in reverse(0..<dogNames.count) 

Il motivo è che quando si rimuove un elemento da una matrice, tutti gli elementi dopo quello rimosso vengono spostati indietro di una posizione, quindi il loro indice viene modificato, mentre tutti gli elementi prima non hanno alcuna variazione di indice. Navigando in ordine inverso sei sicuro che gli oggetti ancora da elaborare non abbiano cambiato il loro indice.

11

aggiornamento: Xcode 8.2.1 • Swift 3.0.2

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 

for (index, element) in dogNames.enumerated() { 
    dogNames[index] = element.capitalized 
} 

print(dogNames) // "["Sean", "Fido", "Sarah", "Parker", "Walt", "Abby", "Yang"]\n" 

Questo è un caso tipico per l'utilizzo di map():

let dogNames1 = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"].map{$0.capitalized} 

A filter() campione:

let dogNamesStartingWithS = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"].filter{$0.hasPrefix("S")} 

dogNamesStartingWithS // ["Sean", "Sarah"] 

è possibile combinare entrambi:

let namesStartingWithS = ["sean", "fido", "sarah", "parker", "walt", "abby", "yang"].map{$0.capitalized}.filter{$0.hasPrefix("S")} 

namesStartingWithS // ["Sean", "Sarah"] 

È inoltre possibile utilizzare il metodo di ordinamento (o in ordine se non si vuole mutare la matrice originale) per ordinare il risultato in ordine alfabetico, se necessario:

let sortedNames = ["sean", "fido", "sarah", "parker", "walt", "abby", "yang"].map{$0.capitalized}.sorted() 

sortedNames // ["Abby", "Fido", "Parker", "Sarah", "Sean", "Walt", "Yang"] 
+0

hmmm cool. Non ho ancora sentito/impara la funzione della mappa. Grazie per questo! – Rhenz

+0

@Rhenz sei il benvenuto –

+0

è abbastanza facile pensare a $ 0 ogni elemento dell'array –

0

Ecco il modo più semplice per farlo in SWIFT 3.0:

var dogNames = ["Sean", "fido", "Sarah", "Parker", "Walt", "abby", "Yang"] 

dogNames = dogNames.map {$0.capitalized} 
print("dogNames: \(dogNames)")