2015-02-13 55 views
6

iterazione di elementi resa erroreArray of struct a Swift

non riusciva a trovare membro 'convertFromStringInterpolationSegment'

println("\(contacts[count].name)")", mentre le stampe dirette voce lista bene.

Cosa mi manca?

struct Person { 
    var name: String 
    var surname: String 
    var phone: String 
    var isCustomer: Bool 

    init(name: String, surname: String, phone: String, isCustomer: Bool) 
    { 
     self.name = name 
     self.surname = surname 
     self.phone = phone 
     self.isCustomer = isCustomer 
    } 

} 

var contacts: [Person] = [] 

var person1: Person = Person(name: "Jack", surname: "Johnson", phone: "7827493", isCustomer: false) 

contacts.append(person1) 

var count: Int = 0 
for count in contacts { 
    println("\(contacts[count].name)") // here's where I get an error 
} 

println(contacts[0].name) // prints just fine - "Jack" 

risposta

6

I for-in ciclo itera su un insieme di elementi, e fornisce l'articolo reale e non il suo indice ad ogni iterazione. Così il vostro ciclo dovrebbe essere riscritto come:

for contact in contacts { 
    println("\(contact.name)") // here's where I get an error 
} 

Si noti che questa linea:

var count: Int = 0 

non ha alcun effetto nel codice, poiché la variabile count nella for-in viene ridefinito e visibili al blocco di codice annidato all'interno del ciclo.

Se si vuole ancora giocare con gli indici, allora è necessario modificare il ciclo come:

for var count = 0; count < contacts.count; ++count { 

o

for count in 0..<contacts.count { 

scorso, se avete bisogno sia l'indice e il valore, forse il modo più semplice è attraverso la funzione globale enumerate, che restituisce un elenco di tuple (indice, valore):

for (index, contact) in enumerate(contacts) { 
    println("Index: \(index)") 
    println("Value: \(contact)") 
} 
+0

Grazie, Antonio. In realtà è lo stesso che avevo usato in Python. Suppongo che mi stavo complicando troppo il semplice. E i complimenti per ** enumerate **, ho dimenticato che è disponibile in Swift. – thinkswift

0

Prima di tutto, non si deve utilizzare init() in struct, in quanto la struttura ha inizializzatore default.Then in questo blocco di codice:

/* 
var count: Int = 0 
for count in contacts { 
    println("\(contacts[count].name)") // here's where I get an error 
} 
*/ 

vostro "conteggio" variabile non è intero, esso `s il tipo è "Persona". Prova questo:

/* 
for count in contacts { 
    println(count.name) // It`s must be OKey. 
} 
*/ 

Spero ti aiuto, e mi dispiace per il mio cattivo inglese: D