ios swift swift-protocols

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})