考慮一個協議的數組和實現它的一類之間進行轉換:夫特:的「協議」陣列和實施
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
我有[MyClass]
類型的數組和我希望將其分配給一個變量類型爲[MyProtocol]
。然而,這會導致嘗試在遊樂場時,一個錯誤(的XCode 6.3,雨燕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]
是什麼力量讓斯威夫特這項任務的正確方法?
P.S.有趣的是,當使用基類而不是協議時,protocolArrA
和protocolArrB
的表達式無誤地工作。
這也是有趣的是指定的[MyClass的]一個新創建的實例也是行之有效:
var protocolArrD: [MyProtocol] = [MyClass]() // A-OK!
託管重現您的問題。它看起來很像一個bug: - /通過classArr.map {$ 0 as MyProtocol}進行手動轉換可能是一種解決方法。 –