在Swift中通过NSMutableArray循环

jsk*_*dd3 13 ios swift

如何在Swift中通过NSMutableArray?我尝试过的:

var vehicles = NSMutableArray()
Run Code Online (Sandbox Code Playgroud)

该数组包含来自类的对象: Vehicle

for vehicle in vehicles {
    println(vehicle.registration)
}
Run Code Online (Sandbox Code Playgroud)

没有编译器告诉我registration不属于我,我无法运行上面的代码AnyObject.在这一点上,我认为这是因为我没有告诉for循环item属于哪种类.所以我修改了代码:

for vehicle: Vehicle in vehicles {
    println(vehicle.registration)
}
Run Code Online (Sandbox Code Playgroud)

现在编译器抱怨向下转换...如何在循环遍历车辆阵列的同时简单地获得对自定义注册属性的访问权限?

dnn*_*agy 29

这应该工作:

for vehicle in (vehicles as NSArray as! [Vehicle]) {
    println(vehicle.registration) 
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 14

正如Romain所说,你可以使用Swift数组.如果继续使用NSMutableArray,您可以执行以下任一操作:

for object in vehicles {
    if let vehicle = object as? Vehicle {
        print(vehicle.registration)
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以强制打开它,使用where限定符来保护自己免受强制转换:

for vehicle in vehicles where vehicle is Vehicle {
    print((vehicle as! Vehicle).registration)
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用功能模式:

vehicles.compactMap { $0 as? Vehicle }
    .forEach { vehicle in
        print(vehicle.registration)
}
Run Code Online (Sandbox Code Playgroud)

显然,如果可能的话,问题是你是否可以退休NSMutableArray并使用Array<Vehicle>(又名[Vehicle]).所以,而不是:

let vehicles = NSMutableArray()
Run Code Online (Sandbox Code Playgroud)

你可以做:

var vehicles: [Vehicle] = []
Run Code Online (Sandbox Code Playgroud)

然后,你可以做以下事情:

for vehicle in vehicles {
    print(vehicle.registration)
}
Run Code Online (Sandbox Code Playgroud)

有时我们会遇到返回NSMutableArray对象的Objective-C代码,但如果这NSMutableArray是在Swift中创建的,那么最好使用它Array<Vehicle>.