2015-02-08 22 views
8

Làm thế nào để Ioop thông qua NSMutableArray trong Swift? Những gì tôi đã cố gắng:Lặp qua NSMutableArray trong Swift

var vehicles = NSMutableArray() 

Mảng chứa các đối tượng từ lớp: Vehicle

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

tôi không thể chạy mã trên mà không trình biên dịch nói với tôi registration không thuộc về AnyObject. Tại thời điểm này tôi cho rằng đó là bởi vì tôi đã không nói cho vòng lặp loại lớp item thuộc về. Vì vậy, tôi đã sửa đổi bằng mã:

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

Bây giờ trình biên dịch phàn nàn về downcasting ... làm cách nào tôi có thể truy cập vào thuộc tính đăng ký tùy chỉnh trong khi lặp qua mảng Phương tiện?

+0

Liệu sự giúp đỡ này? http://dev.eltima.com/post/96538497489/convert-nsmutablearray-to-swift-array –

Trả lời

23

này nên làm việc:

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

Và làm thế nào để làm điều đó cho NSMutableArray? –

+0

Câu trả lời của Rob là tốt hơn: tại sao buộc một tùy chọn khi bạn không phải làm vậy? –

3

NSMutableArray đến từ thế giới Mục tiêu-C. Giờ đây, bạn có thể sử dụng các loại generics và các mảng được đánh mạnh, như sau:

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

Cảm ơn câu trả lời của bạn! Tôi có thể sử dụng phương thức 'removeObjectsAtIndexes' trên mảng' vehicles' của bạn không? Tôi đang chuyển đổi một NSArray thành một mảng cho phép tôi sử dụng nó cho các lý do kỹ thuật trong ứng dụng của tôi ... miễn là hoạt động của bạn là hoàn hảo – jskidd3

+0

Chắc chắn. Các mảng Swift không cung cấp phương thức này một cách tự nhiên, nhưng bạn có thể tự viết mã mà không gặp nhiều rắc rối: http://stackoverflow.com/questions/26173565/removeobjectsatindexes-for-swift-arrays (xem câu trả lời có phần lớn upvotes, nó là không phải là một trong những chấp nhận nhưng một trong những hợp lệ nhất) – Romain

11

Vì Romain đề xuất, bạn có thể sử dụng mảng Swift. Nếu bạn tiếp tục sử dụng NSMutableArray, bạn có thể làm một trong hai:

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

hoặc, nếu bạn biết nó chỉ Vehicle đối tượng, bạn có thể buộc Unwrap nó:

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

hoặc, như DNagy gợi ý:

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

Rõ ràng, nếu có thể, câu hỏi là liệu bạn có thể nghỉ hưu hay không NSMutableArray và sử dụng Array<Vehicle> (aka [Vehicle]) để thay thế. Vì vậy, thay vì:

let vehicles = NSMutableArray() 

Bạn có thể làm:

var vehicles = [Vehicle]() 

Sau đó, bạn có thể làm những việc như:

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

Đôi khi chúng ta đang mắc kẹt với mã Objective-C đó là trở về NSMutableArray đối tượng, nhưng nếu điều này NSMutableArray đã được tạo trong Swift, có lẽ nên sử dụng Array<Vehicle> thay thế.

Các vấn đề liên quan