protocol P : class {
var value:Int {get}
}
class X : P {
var value = 0
init(_ value:Int) {
self.value = value
}
}
var ps:[P] = [X(1), X(2)]
for p in ps {
if let x = p as? X { // works for a single variable
...
}
}
if let xs = ps as? [X] { // doesn't work for an array (EXC_BAD_ACCESS)
...
}
如果P是类而不是协议,那么代码将正常工作。 类和协议有什么区别?它们都是作为堆中的指针来实现的,不是吗? 上面的代码可以编译成功,但在运行时崩溃。这个EXC_BAD_ACCESS错误是什么意思?协议类型的数组不能倒向具体类型数组
感谢@Antonio,但我仍然不明白这个示例代码是如何工作的。
let someObjects: [AnyObject] = [
Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"),
Movie(name: "Moon", director: "Duncan Jones"),
Movie(name: "Alien", director: "Ridley Scott")
]
for movie in someObjects as [Movie] {
println("Movie: '\(movie.name)', dir. \(movie.director)")
}
是AnyObject的特例吗?
protocol P {
}
@objc class X : P {
}
@objc class Y : X {
}
var xs:[X] = [Y(), Y()]
var ps:[P] = [Y(), Y()]
xs as? [Y] // works
ps as? [Y] // EXC_BAD_ACCESS
我试图在游乐场此代码。由于这是纯粹的swift代码,我认为它与@objc无关。
我已经更新了我的答案 - 前一个显然是错的。 – Antonio 2014-09-01 08:25:09
我还是不明白为什么'is'和'as?'操作符用于单个变量,但不适用于数组。但是现在可以通过'flagMap'解决。 – 2015-09-05 07:12:36