2015-02-13 8 views
6

iteracji elementów uzyskując błądArray struktury w Swift

nie mógł znaleźć członek 'convertFromStringInterpolationSegment'

println("\(contacts[count].name)")", podczas gdy bezpośrednie wydruki elementu listy w porządku.

Czego mi brakuje?

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" 

Odpowiedz

6

W for-in pętla iteruje zbiór elementów i zapewnia rzeczywisty przedmiot, a nie jego indeks w każdej iteracji. Więc pętli powinny być zapisane jako:

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

pamiętać, że ta linia:

var count: Int = 0 

ma żadnego efektu w kodzie, ponieważ zmienna w for-incount jest nowo i widoczne dla bloku kodu zagnieżdżony w pętli.

Jeśli nadal chce grać z indeksami, a następnie trzeba zmodyfikować pętlę jako:

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

lub

for count in 0..<contacts.count { 

Ostatni, jeśli potrzebują zarówno indeks i wartość, może Najprostszym sposobem jest globalna funkcja enumerate, która zwraca listę (krotek, wartość) krotek:

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

Dzięki Antonio. W rzeczywistości jest taki sam jak kiedyś w Pythonie. Wydaje mi się, że przereklamowałem to proste. I kudos za ** wyliczyć **, zapomniałem, że jest dostępny w Swift. – thinkswift

0

Przede wszystkim, nie należy przy użyciu init() w struktury, ponieważ struktura inicjalizator default.Then ma w tym bloku kodu:

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

zmiennej „count” nie jest liczbą całkowitą, nadszedł type to "Person". Spróbuj tego:

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

Mam nadzieję, że mogę pomóc, i przepraszam za mój zły angielski: D