2015-02-08 39 views
8

Wie kann ich ein NSMutableArray in Swift durchlaufen? Was ich versucht habe:Looping durch NSMutableArray in Swift

var vehicles = NSMutableArray() 

Die Array-Objekte aus der Klasse enthält: Vehicle

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

Ich kann nicht den obigen Code ohne den Compiler laufen mir zu sagen registration nicht zu AnyObject gehört. An dieser Stelle nahm ich an, dass das war, weil ich der for-Schleife nicht gesagt hatte, welcher Typ von Klasse item gehört. Also habe ich durch Code geändert:

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

Jetzt ist der Compiler beschwert sich über einziehe ... wie kann ich einfach Zugriff auf die individuelle Registrierung Eigenschaft erlangen, während Schleife durch das Array von Fahrzeugen?

+0

hilft das? http://dev.eltima.com/post/96538497489/convert-nsmutablearray-to-swift-array –

Antwort

23

sollte diese Arbeit:

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

Und wie man es für NSMutableArray tut? –

+0

Robs Antwort ist besser: Warum erzwingen Sie eine optionale, wenn Sie nicht müssen? –

3

NSMutableArray kommt aus der Objective-C-Welt. Jetzt können Sie Generika verwenden und stark typisierte Arrays, wie folgt aus:

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

Danke für Ihre Antwort! Könnte ich die 'removeObjectsAtIndexes' Methode für Ihr' vehicles' Array verwenden? Ich konvertiere ein NSArray in ein Array, das es mir erlaubt, das aus technischen Gründen in meiner App zu verwenden ... solange das funktioniert, ist deine Antwort perfekt – jskidd3

+0

Sicher. Swift-Arrays bieten diese Methode nativ nicht, aber Sie können Ihre eigenen ohne große Probleme programmieren: http://stackoverflow.com/questions/26173565/removeobjectsatindexes-for-swift-arrays (siehe die Antwort, die die meisten upvotes hat, ist es nicht das akzeptierte aber das meiste gültige) – Romain

11

Als Romain vorgeschlagen, können Sie Swift Array. Wenn Sie weiterhin NSMutableArray verwenden, könnten Sie entweder tun:

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

oder, wenn man es nur Vehicle Objekte kennen, können Sie es auspacken erzwingen:

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

oder, wie DNagy vorgeschlagen:

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

Offensichtlich möglich, wenn sich die Frage, ob Sie sich zurückziehen können NSMutableArray und verwenden Sie stattdessen Array<Vehicle> (aka [Vehicle]). Anstatt also:

let vehicles = NSMutableArray() 

können Sie tun:

var vehicles = [Vehicle]() 

Dann können Sie tun Dinge wie:

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

Manchmal sind wir mit Objective-C-Code fest, das heißt Rückkehr NSMutableArray Objekte, aber wenn dieses NSMutableArray in Swift erstellt wurde, ist es wahrscheinlich besser, stattdessen Array<Vehicle> zu verwenden.