Swift: conversión entre matrices de 'Protocolo' y matrices de implementación de class

Considere un protocolo y una class que lo implementa:

protocol MyProtocol { var x: Int { get } } class MyClass : MyProtocol { var x: Int = 5 } 

Tengo una matriz de tipo [MyClass] y deseo asignarla a una variable de tipo [MyProtocol] . Sin embargo, esto provoca un error cuando se intentó en 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] 

¿Cuál es la forma correcta de realizar esta tarea en Swift?

PS Curiosamente, cuando se usa una class base en lugar de un protocolo, las expresiones para protocolArrA y protocolArrB funcionan sin error.

También es interesante observar que la asignación de una instancia recién creada de [MyClass] también funciona bien:

 var protocolArrD: [MyProtocol] = [MyClass]() // A-OK! 

Puede usar el map para lanzar cada elemento al tipo deseado:

 protocol MyProtocol { var x: Int { get } } class MyClass : MyProtocol { var x: Int = 5 } var classArr: [MyClass] = [MyClass(), MyClass()] var protocolArrA:[MyProtocol] = classArr.map{$0 as MyProtocol} var andBack:[MyClass] = protocolArrA.map{$0 as! MyClass} 

Tenga en count que Swift puede inferir todos los types de arreglos anteriores, por lo que esto puede escribirse más sucintamente como:

 var classArr = [MyClass(), MyClass()] var protocolArrA = classArr.map{$0 as MyProtocol} var andBack = protocolArrA.map{$0 as! MyClass} 

Prueba esto

 @objc protocol MyProtocol { var x: Int { get } } class MyClass : MyProtocol { @objc var x: Int = 5 } 

Ambos funcionan si se usa @objc

  var classArr: [MyClass] = [MyClass(), MyClass()] var protocolArrA: [MyProtocol] = classArr var protocolArrB: [MyProtocol] = classArr as [MyProtocol]