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 establecer esta propiedad en una matriz de objetos que implementan el Option
protocolo en otro VC prepareForSegue
, obtengo 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 en absoluto qué tiene que ver Objective-C con él: mi proyecto solo contiene archivos Swift, y estas matrices no entran ni salen de ningún método marco que necesitan ser puenteados NSArray
.
ios
swift
swift-protocols
Robert Atkins
fuente
fuente
@objc
tu protocolo? stackoverflow.com/a/28029568/377369Respuestas:
He encontrado una solución. Es bastante ... insatisfactorio , pero funciona. Donde configuro la matriz en el controlador de vista de destino, hago:
fuente
options as [Option]
Dejó escapar un comentario muy revelador, que sugiere la fuente del problema. Una "Matriz de cosas que implementan Option" no es una Matriz de Opciones.
El problema es con el tipo de
options
espalda en el punto donde lo creaste (adentroprepareForSegue
). No muestra ese código, pero apuesto a que no puede lanzarlo / escribirlo en ese momento. Por eso falla la tarea.options
puede haber una serie de cosas que de hecho suceden para adoptar Option, pero eso no es suficiente; debe escribirse como una matriz de Option.Entonces, de vuelta
prepareForSegue
, forme suoptions
así:Ahora podrás asignarlo directamente a
destinationViewController.options
.Aquí hay un caso de prueba rápido (en un patio de recreo; detesto los patios de recreo, pero pueden tener sus usos):
(También probé esto en una aplicación real con una real
prepareForSegue
, y funciona bien).fuente
viewController.options = things as [Option]
) ni la creación de una variable temporal escrita explícitamente[Option]
como sugiere aquí, en realidad funciona. En ambos casos aparece el error de tiempo de ejecución.Estaba teniendo el mismo problema y lo arreglé marcando mi protocolo con
@objc
, en tu caso se vería asíObtuve la solución de esta respuesta
fuente
Este también funciona bien
fuente