Eu declarei um protocolo Swift:
protocol Option {
var name: String { get }
}
Eu declaro várias implementações deste protocolo - algumas classes, alguns enums.
Eu tenho um controlador de visualização com uma propriedade declarada assim:
var options: [Option] = []
Quando tento definir essa propriedade para uma matriz de objetos que implementam o Option
protocolo em outro VC prepareForSegue
, recebo um erro de tempo de execução:
fatal error: array cannot be bridged from Objective-C
Por que isso não funciona? O compilador tem todas as informações de que precisa, e eu não entendo o que Objective-C tem a ver com ele - meu projeto contém apenas arquivos Swift, e esses arrays não estão entrando ou saindo de quaisquer métodos de framework que necessitam que eles sejam ligados NSArray
.
ios
swift
swift-protocols
Robert Atkins
fonte
fonte
@objc
seu protocolo? stackoverflow.com/a/28029568/377369Respostas:
Eu encontrei uma solução. É bastante ... insatisfatório , mas funciona. Onde eu defino a matriz no controlador de visualização de destino, eu faço:
fonte
options as [Option]
Você deixou escapar uma observação muito reveladora, que sugere a origem do problema. Uma "Matriz de coisas que implementam Opção" não é uma Matriz de Opções.
O problema é com o tipo de
options
costas no ponto onde você as cria (dentroprepareForSegue
). Você não mostra esse código, mas aposto que você não conseguiu lançar / digitá-lo nesse ponto. É por isso que a atribuição falha.options
pode ser uma série de coisas que de fato acontecem para adotar Option, mas isso não é suficiente; deve ser digitado como uma matriz de Option.Então, de volta
prepareForSegue
, formeoptions
assim:Agora você poderá atribuí-lo diretamente a
destinationViewController.options
.Aqui está um caso de teste rápido (em um playground; eu detesto playgrounds, mas eles podem ter seu uso):
(Eu também testei isso em um aplicativo real com um real
prepareForSegue
e funciona bem.)fonte
viewController.options = things as [Option]
) nem criar uma variável temporária explicitamente digitada[Option]
como você sugere aqui realmente funciona. Em ambos os casos, recebo o erro de tempo de execução.Eu estava com o mesmo problema e resolvi marcando meu protocolo com
@objc
, no seu caso ficaria assimConsegui a solução com esta resposta
fonte
Este também funciona bem
fonte