ios - "Error fatal: la matriz no puede ser puenteada desde Objective-C"-¿Por qué lo estás intentando, Swift?
swift ios (4)
el compilador sabe que estoy pasando una matriz de cosas que implementan la opción
Has dejado escapar un comentario muy revelador, que sugiere la fuente del problema. Una "matriz de cosas que implementan la opción" no es una matriz de opción.
El problema es con el tipo de
options
en el punto donde lo creó (en
prepareForSegue
).
No muestra ese código, pero apuesto a que no puede emitirlo / escribirlo en ese momento.
Es por eso que la tarea falla.
options
pueden ser una variedad de cosas que de hecho adoptan la opción, pero eso no es suficiente;
debe
escribirse
como una matriz de opciones.
Entonces, de vuelta en
prepareForSegue
, forme sus
options
esta manera:
let options : [Option] = // ... whatever ...
Ahora
podrá asignarlo directamente a
destinationViewController.options
.
Aquí hay un caso de prueba rápida (en un parque infantil; detesto los parques infantiles, pero pueden tener sus usos):
protocol Option {
var name : String {get}
}
class ViewController : UIViewController {
var options : [Option] = []
}
enum Thing : Option {
var name : String {
get {
return "hi"
}
}
case Thing
}
let vc = ViewController()
let options : [Option] = [Thing.Thing]
vc.options = options // no problem
(También probé esto en una aplicación real con un
prepareForSegue
real, y funciona bien).
He declarado un protocolo Swift:
protocol Option {
var name: String { get }
}
Declaro múltiples implementaciones de este protocolo: algunas clases, algunas enumeraciones.
Tengo un controlador de vista con una propiedad declarada así:
var options: [Option] = []
Cuando intento configurar esta propiedad en una matriz de objetos que implementan el protocolo de
Option
en
prepareForSegue
otro VC,
prepareForSegue
un error de tiempo de ejecución:
fatal error: array cannot be bridged from Objective-C
¿Por qué no funciona esto?
El compilador tiene toda la información que necesita, y no entiendo lo que Objective-C tiene que ver con eso: mi proyecto contiene solo archivos Swift, y estas matrices no entran o salen de ningún método de marco que necesitan que se unan a
NSArray
.
Estaba teniendo el mismo problema y lo arreglé marcando mi protocolo con
@objc
, en su caso se vería así
@objc protocol Option {
var name: String { get }
}
Obtuve la solución de esta respuesta
Este también funciona bien
destinationViewController.options = options.map{$0}
He encontrado una solución. Es bastante ... insatisfactorio , pero funciona. Donde configuro la matriz en el controlador de vista de destino que hago:
destinationViewController.options = options.map({$0 as Option})