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

时间:2015-05-07 12:13:55

标签: ios swift swift-protocols

我已经宣布了一个Swift协议:

protocol Option {
    var name: String { get }
}

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

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

var options: [Option] = []

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

fatal error: array cannot be bridged from Objective-C

为什么这不起作用?编译器拥有它需要的所有信息,而且我根本不了解Objective-C与它有什么关系 - 我的项目只包含Swift文件,这些数组不会进出任何文件。框架方法需要将它们桥接到NSArray

4 个答案:

答案 0 :(得分:83)

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

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

答案 1 :(得分:22)

  

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

的数组

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

问题在于options的类型在您创建它的位置(在prepareForSegue中)。你没有显示该代码,但我打赌你没有在那时投出/输入它。这就是分配失败的原因。 options可能是一系列实际上恰好采用Option的东西,但这还不够;它必须键入作为Option数组。

所以,回到prepareForSegue,形成你的options

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

现在您可以将其直接分配到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

(我也在实际应用中使用实际prepareForSegue对此进行了测试,效果很好。)

答案 2 :(得分:16)

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

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

this answer获得解决方案

答案 3 :(得分:1)

这个也很好用

<div id="container">
  <div id="hoverme" href="#">Hover me to turn the red ones green.</div>
  <div class="other">I want to turn green.</div>
  <div class="other">I want to turn green, too.</div>
</div>