consideri un protocollo e una classe che implementa:Swift: la conversione tra le matrici di 'protocollo' e array di attuazione Classe
protocol MyProtocol {
var x: Int { get }
}
class MyClass : MyProtocol {
var x: Int = 5
}
Ho un array di tipo [MyClass]
e desidero assegnarlo a una variabile di tipo [MyProtocol]
. Tuttavia, questo causa un errore quando ha tentato in 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]
Qual è il modo corretto di fare questo compito a Swift?
P.S. È interessante notare che, quando si utilizza una classe base anziché un protocollo, le espressioni per protocolArrA
e protocolArrB
funzionano senza errori.
E 'anche interessante notare che l'assegnazione di una nuova istanza di [MyClass] funziona anche bene:
var protocolArrD: [MyProtocol] = [MyClass]() // A-OK!
riuscito a riprodurre il problema. Sembra molto simile a un bug: -/Il cast manuale tramite 'classArr.map {$ 0 come MyProtocol}' potrebbe essere una soluzione. –