“致命错误:数组无法从Objective-C桥接” – 为什么你甚至在尝试Swift?

我已经声明了一个Swift协议:

protocol Option { var name: String { get } } 

我声明了这个协议的多个实现 – 一些类,一些枚举。

我有一个视图控制器的属性声明如下:

 var options: [Option] = [] 

当我尝试将此属性设置为在另一个VC的prepareForSegue中实现Option协议的对象数组时,出现运行时错误:

 fatal error: array cannot be bridged from Objective-C 

为什么这不工作? 编译器拥有它所需要的所有信息,而且我不明白Objective-C与它有什么关系 – 我的项目只包含Swift文件,而且这些数组不会进出任何框架方法使他们被桥接到NSArray

我find了一个解决scheme。 这是相当不令人满意的 ,但它的工作原理。 我在目标视图控制器上设置数组的位置:

 destinationViewController.options = options.map({$0 as Option}) 

编译器知道我正在传递一个实现Option的东西

你已经放弃了一个非常明显的评论,这表明了问题的根源。 一个“实现选项的数组”不是一个选项数组。

问题是options的types返回到您创build它的位置(在prepareForSegue )。 你不显示那个代码,但是我敢打赌,你没有在这个时候input/input。 这就是为什么分配失败。 options可能是事实上采用Option的一系列事物,但这还不够; 它必须被键入为一个选项的数组。

所以,回到prepareForSegue ,形成你的options是这样的:

 let options : [Option] = // ... whatever ... 

现在您可以将其直接分配给destinationViewController.options

这是一个快速的testing案例(在操场上,我厌恶游乐场,但他们可以使用):

 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 

(我也用一个实际的prepareForSegue在一个实际的应用程序中testing了这个,并且工作正常。)

我有同样的问题,并修复它标记我的协议与@objc ,在你的情况下,它会是这样的

 @objc protocol Option { var name: String { get } } 

从这个答案得到解决scheme

这一个也工作正常

 destinationViewController.options = options.map{$0}