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
Я пробовал этот код на детской площадке. Поскольку это чистый быстрый код, я думаю, что это не имеет ничего общего с @objc.