"fatal error: array cannot be bridged from Objective-C"—Why are you even trying, Swift?
"fatal error: array cannot be bridged from Objective-C"—Why are you even trying, 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
.
的框架方法
我找到了解决办法。相当……不满意,但它确实有效。我在目标视图控制器上设置数组的位置:
destinationViewController.options = options.map({[=10=] as Option})
the compiler knows I'm passing in an Array of things that implement Option
你在这里说了一句很有启发性的话,暗示了问题的根源。 "Array of things that implement Option" 不是选项数组。
问题在于 options
的类型回到您创建它的位置(在 prepareForSegue
中)。您没有显示该代码,但我敢打赌您当时无法投射/键入它。这就是分配失败的原因。 options
可能是一系列的事情,实际上恰好采用了 Option,但这还不够;它必须是 typed 作为 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
测试了这个,它工作正常。)
我遇到了同样的问题并修复了它用 @objc
标记我的协议,在你的情况下它看起来像这样
@objc protocol Option {
var name: String { get }
}
从this answer
得到解决方案
这个也很好用
destinationViewController.options = options.map{[=10=]}
我已经声明了一个 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
.
我找到了解决办法。相当……不满意,但它确实有效。我在目标视图控制器上设置数组的位置:
destinationViewController.options = options.map({[=10=] as Option})
the compiler knows I'm passing in an Array of things that implement Option
你在这里说了一句很有启发性的话,暗示了问题的根源。 "Array of things that implement Option" 不是选项数组。
问题在于 options
的类型回到您创建它的位置(在 prepareForSegue
中)。您没有显示该代码,但我敢打赌您当时无法投射/键入它。这就是分配失败的原因。 options
可能是一系列的事情,实际上恰好采用了 Option,但这还不够;它必须是 typed 作为 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
测试了这个,它工作正常。)
我遇到了同样的问题并修复了它用 @objc
标记我的协议,在你的情况下它看起来像这样
@objc protocol Option {
var name: String { get }
}
从this answer
得到解决方案这个也很好用
destinationViewController.options = options.map{[=10=]}