"致命错误:数组无法与Objective-C桥接" - 你为什么试试,Swift?

Rob*_*ins 92 ios swift swift-protocols

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

protocol Option {
    var name: String { get }
}
Run Code Online (Sandbox Code Playgroud)

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

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

var options: [Option] = []
Run Code Online (Sandbox Code Playgroud)

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

fatal error: array cannot be bridged from Objective-C
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ins 83

我找到了解决方案.它非常...... 不满意,但它确实有效.我在目标视图控制器上设置数组的地方:

destinationViewController.options = options.map({$0 as Option})
Run Code Online (Sandbox Code Playgroud)

  • "一系列实现选项的东西"啊,但这与选项数组不同,这就是你所需要的.看我的回答. (2认同)

mat*_*att 22

编译器知道我传入了一个实现Option的数组

你已经在那里发表了一个非常有启发性的评论,这表明问题的根源."实现选项的事物数组"不是选项数组.

问题在于options您创建它的位置(返回prepareForSegue).你没有显示该代码,但我打赌你没有在那时投射/输入它.这就是分配失败的原因.options实际上可能会采用一些选项,但这还不够; 它必须键入一个Option数组.

所以,回来prepareForSegue,形成options这样的:

let options : [Option] = // ... whatever ...
Run Code Online (Sandbox Code Playgroud)

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

这是一个快速测试案例(在操场上;我讨厌游乐场,但他们可以使用它们):

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
Run Code Online (Sandbox Code Playgroud)

(我也在一个真实的应用程序中用实际测试了prepareForSegue它,它工作正常.)

  • 以这种方式看待它.我已经向你展示了有效的代码.你没有___显示_adesn't_工作的代码 - 我无法从给定的数据中重现你的问题.帮我复制一下. (2认同)

小智 16

我遇到了同样的问题并修复了它标记我的协议@objc,在你的情况下,它看起来像这样

@objc protocol Option {
    var name: String { get }
}
Run Code Online (Sandbox Code Playgroud)

得到了这个答案的解决方案