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)
...
}
Jeśli P jest klasą zamiast protokołu, to kod działa poprawnie. Jaka jest różnica między klasą a protokołem? Oba są zaimplementowane jako wskaźniki w stercie, prawda? Powyższy kod można skompilować pomyślnie, ale awarię w czasie wykonywania. Co oznacza ten błąd EXC_BAD_ACCESS?Tablica z wpisaną tablicą nie może być w dół do konkretnej tablicy typów
Dzięki @Antonio, ale nadal nie rozumiem, jak działa ten przykładowy kod.
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)")
}
Czy AnyObject to specjalny przypadek?
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
Próbowałem ten kod w plac zabaw. Ponieważ jest to czysty, szybki kod, myślę, że nie ma to nic wspólnego z @objc.
Zaktualizowałem moją odpowiedź - poprzednia była wyraźnie błędna. – Antonio
Nadal nie rozumiem, dlaczego operator 'jest' i' jak? 'Działa dla pojedynczej zmiennej, ale nie dla tablicy. Ale można to teraz rozwiązać za pomocą 'flagMap'. –