2015-06-11 22 views
5

Ho deciso di imparare Swift e ho deciso di iniziare subito con Swift 2.Indici di stringa in Swift 2

Quindi, ecco un esempio molto semplice, che è simile a uno degli esempi di proprio e-book di Apple circa Swift

let greeting = "Guten Tag" 

for index in indices(greeting) { 
    print(greeting[index]) 
} 

Ho provato questo nel parco giochi di Xcode 7, e ho ricevuto il seguente errore

Cannot invoke 'indices' with an argument list of type '(String)'

ho anche provato la stessa cosa con Xcode 6 (che è Swift 1.2 per quanto ne so), e ha funzionato come previsto.

Ora, la mia domanda è:

  1. un errore in Xcode 7, è ancora una versione beta, dopo tutto, o?
  2. Qualcosa che non funziona più con Swift 2 e l'e-book non è ancora completamente aggiornato?

Inoltre: se la risposta è "2", come sostituire indices(String) in Swift 2?

risposta

8

in un parco giochi, se si va a menu Visualizza> Debug Area> Mostra area di debug, è possibile vedere l'errore completo nella console:

/var/folders/2q/1tmskxd92m94__097w5kgxbr0000gn/T/./lldb/94138/playground29.swift:5:14: error: 'indices' is unavailable: access the 'indices' property on the collection for index in indices(greeting)

Inoltre, String s non sono conformi al SequenceType s più , ma puoi accedere ai loro elementi chiamando characters.

Quindi la soluzione per Swift 2 è quello di fare in questo modo:

let greeting = "Guten Tag" 

for index in greeting.characters.indices { 
    print(greeting[index]) 
} 

Risultato:

G
u
t
e
n

T
a
g

Naturalmente, presumo tuo esempio è solo per testare indices, ma per il resto puoi semplicemente fare:

for letter in greeting.characters { 
    print(letter) 
} 
+0

Grazie. E sì, stavo solo testando 'indices' e già consapevole della soluzione più semplice dato che' characters' è menzionato in precedenza nel libro. Anche il tuo suggerimento sulla console di debug è stato molto utile. – mmgross

+1

Prego. In effetti, ho esitato ad aggiungere questo ultimo commento poiché ero abbastanza sicuro che ne fossi a conoscenza.:) Ma l'ho aggiunto alla fine perché ho pensato che potesse aiutare i futuri lettori a essere sicuri che l'argomento del post fosse 'indices' e non accedesse effettivamente ai personaggi. – Moritz

1

Solo per il completamento, ho trovato un modo molto semplice per ottenere i caratteri e le stringhe di stringhe (questo non è il mio codice, ma non ricordo dove l'ho preso da):

includono questa estensione stringa in il progetto:

extension String { 

    subscript (i: Int) -> Character { 
     return self[self.startIndex.advancedBy(i)] 
    } 

    subscript (i: Int) -> String { 
     return String(self[i] as Character) 
    } 

    subscript (r: Range<Int>) -> String { 
     return substringWithRange(Range(start: startIndex.advancedBy(r.startIndex), end: startIndex.advancedBy(r.endIndex))) 
    } 
} 

questo vi permetterà di fare:

print("myTest"[3]) //the result is "e" 
print("myTest"[1...3]) //the result is "yTe" 
-1

Ecco il codice che si cerca:

var middleName :String? = "some thing" 
for index in (middleName?.characters.indices)! { 
// do some thing with index 
}