Matrices de genéricos en Swift
He estado jugando con matrices de clases genéricas con diferentes tipos. Es más fácil explicar mi problema con un código de muestra:
// Obviously a very pointless protocol...
protocol MyProtocol {
var value: Self { get }
}
extension Int : MyProtocol { var value: Int { return self } }
extension Double: MyProtocol { var value: Double { return self } }
class Container<T: MyProtocol> {
var values: [T]
init(_ values: T...) {
self.values = values
}
func myMethod() -> [T] {
return values
}
}
Ahora si trato de crear una matriz de contenedores así:
var containers: [Container<MyProtocol>] = []
Me sale el error:
El protocolo 'MyProtocol' solo se puede usar como una restricción genérica porque tiene requisitos de tipo Self o asociados.
Para arreglar esto puedo usar[AnyObject]
:
let containers: [AnyObject] = [Container<Int>(1, 2, 3), Container<Double>(1.0, 2.0, 3.0)]
// Explicitly stating the types just for clarity.
Pero ahora surge otro 'problema' al enumerar a través decontainers
:
for container in containers {
if let c = container as? Container<Int> {
println(c.myMethod())
} else if let c = container as? Container<Double> {
println(c.myMethod())
}
}
Como puede ver en el código anterior, después de determinar el tipo decontainer
Se llama el mismo método en ambos casos. Mi pregunta es:
¿Hay una mejor manera de obtener elContainer
con el tipo correcto que lanzar a cada tipo posible deContainer
? ¿O hay algo más que he pasado por alto?