“致命错误:数组无法从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}