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)
...
}
Se P è una classe anziché un protocollo, il codice funziona correttamente. Qual è la differenza tra classe e protocollo? Sono entrambi implementati come puntatori nell'heap, vero? Il codice sopra può essere compilato con successo, ma si blocca in fase di runtime. Cosa significa questo errore EXC_BAD_ACCESS?L'array digitato per protocollo non può essere downcast a tipo concreto array
Grazie a @Antonio, ma ancora non capisco come funziona questo codice di esempio.
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 è un caso speciale?
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
ho provato questo codice in un parco giochi. Poiché si tratta di un codice swift puro, penso che non abbia nulla a che fare con @objc.
Ho aggiornato la mia risposta: la precedente era chiaramente sbagliata. – Antonio
Ancora non capisco perché l'operatore 'is' e' as? 'Funzioni per una singola variabile, ma non per una matrice. Ma questo può essere risolto con 'flagMap' ora. –