Matrizes de genéricos no Swift
Eu tenho brincado com matrizes de classes genéricas com tipos diferentes. É mais fácil explicar meu problema com algum código de exemplo:
// 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
}
}
Agora, se eu tentar criar uma matriz de contêineres assim:
var containers: [Container<MyProtocol>] = []
Eu recebo o erro:
O protocolo 'MyProtocol' pode ser usado apenas como uma restrição genérica, porque possui requisitos de tipo Próprio ou associado.
Para consertar isso eu posso 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.
Mas agora outro 'problema' surge ao enumerar atravéscontainers
:
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 você pode ver no código acima, depois de determinar o tipo decontainer
o mesmo método é chamado nos dois casos. Minha pergunta é:
Existe uma maneira melhor de obter oContainer
com o tipo correto do que transmitir para todos os tipos possíveis deContainer
? Ou há algo mais que eu tenha esquecido?