【发布时间】:2015-06-08 09:03:58
【问题描述】:
考虑一个协议和一个实现它的类:
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
我有一个[MyClass] 类型的数组,我希望将它分配给[MyProtocol] 类型的变量。但是,这在 Playground 中尝试时会导致错误(XCode 6.3、Swift 1.2):
var classArr: [MyClass] = [MyClass(), MyClass()]
var protocolArrA: [MyProtocol] = classArr // Causes error: EXC_BAD_INSTRUCTION
var protocolArrB: [MyProtocol] = classArr as [MyProtocol] // Causes error: EXC_BAD_INSTRUCTION
var protocolArrC: [MyProtocol] = [MyProtocol](classArr) // Causes error: Cannot find an initializer for type [MyProtocol[ that accepts an argument list of type [MyClass]
在 Swift 中进行这项作业的正确方法是什么?
附:有趣的是,当使用基类而不是协议时,protocolArrA 和 protocolArrB 的表达式可以正常工作。
有趣的是,分配一个新创建的 [MyClass] 实例也很有效:
var protocolArrD: [MyProtocol] = [MyClass]() // A-OK!
【问题讨论】:
-
设法重现您的问题。这看起来很像一个错误:-/ 通过
classArr.map{$0 as MyProtocol}手动转换可能是一种解决方法。