2015-02-08 15 views
8

Jak można przechodzić przez NSMutableArray w Swift? Co próbowałem:Zapętlenie przez NSMutableArray w Swift

var vehicles = NSMutableArray() 

tablica zawiera obiekty z klasy: Vehicle

for vehicle in vehicles { 
    println(vehicle.registration) 
} 

nie mogę uruchomić powyższy kod bez kompilator mówi mi registration nie należy do AnyObject. W tym momencie założyłem, że to dlatego, że nie powiedziałem pętli for, do której klasy należy klasa item. Więc zmodyfikowane przez kod:

for vehicle: Vehicle in vehicles { 
    println(vehicle.registration) 
} 

Teraz kompilator narzeka rzutowanie w dół ... w jaki sposób można łatwo uzyskać dostęp do niestandardowych własności rejestracji przy jednoczesnym pętli w tablicy pojazdów?

+0

Czy to pomoże? http://dev.eltima.com/post/96538497489/convert-nsmutablearray-to-swift-array –

Odpowiedz

23

To powinno działać:

for vehicle in (vehicles as NSArray as! [Vehicle]) { 
    println(vehicle.registration) 
} 
+0

A jak to zrobić dla NSMutableArray? –

+0

Rob's answer is better: dlaczego force opcjonalnie, kiedy nie musisz? –

3

NSMutableArray pochodzi ze świata Objective-C. Teraz możesz użyć generycznych i mocno wpisanych tablic, takich jak:

var vehicles = [Vehicle]() 
... 
for vehicle in vehicles { 
    println(vehicle.registration) 
} 
+0

Dzięki za odpowiedź! Czy mógłbym użyć metody 'removeObjectsAtIndexes' w tablicy' vehicles'? Przekształcam NSArray w tablicę, która pozwala mi korzystać z niej z przyczyn technicznych w mojej aplikacji ... pod warunkiem, że odpowiedź jest doskonała – jskidd3

+0

Pewnie. Tablice Swift nie udostępniają tej metody natywnie, ale można bez problemu zakodować własny kod: http://stackoverflow.com/questions/26173565/removeobjectsatindexes-for-swift-arrays (zobacz odpowiedź, która ma większość przebojów, jest nie zaakceptowany, ale najbardziej ważny) – Romain

11

Jak zasugerował Romain, możesz użyć tablicy Swift. Jeśli w dalszym ciągu korzystać z NSMutableArray, można zrobić albo:

for object in vehicles { 
    if let vehicle = object as? Vehicle { 
     print(vehicle.registration) 
    } 
} 

lub, jeśli wiesz, że to tylko Vehicle obiekty, można wymusić rozpakować go:

for vehicle in vehicles { 
    print((vehicle as! Vehicle).registration) 
} 

albo, jak sugeruje DNagy:

for vehicle in vehicles as NSArray as! [Vehicle] { 
    print(vehicle.registration) 
} 

Oczywiście, jeśli to możliwe, pytanie brzmi, czy można przejść na emeryturę NSMutableArray i zamiast tego użyj Array<Vehicle> (alias [Vehicle]). Tak więc, zamiast:

let vehicles = NSMutableArray() 

można zrobić:

var vehicles = [Vehicle]() 

Następnie można robić takie rzeczy jak:

for vehicle in vehicles { 
    print(vehicle.registration) 
} 

Czasami utknęliśmy z kodem Objective-C, który jest powracającej NSMutableArray obiektów, ale jeśli ten NSMutableArray został utworzony w Swift, prawdopodobnie lepiej jest użyć Array<Vehicle>.

Powiązane problemy