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)")
}
Is 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.
Я обновил свой ответ - предыдущий явно был неправ. – Antonio
Я до сих пор не понимаю, почему оператор 'is' и' as? 'Работает для одной переменной, но не для массива. Но это можно решить с помощью 'flagMap'. –