Les tableaux de Génériques Swift

J'ai été jouer avec des tableaux de classes génériques de différents types. Il est plus facile d'expliquer mon problème avec un exemple de code:

//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
}
}

Maintenant, si j'essaie de créer un tableau de conteneurs comme suit:

var containers: [Container<MyProtocol>] = []

J'obtiens l'erreur:

D'un protocole de MyProtocol' ne peut être utilisé comme une contrainte générique parce qu'il a de Soi ou de type associé exigences.

Pour résoudre ce que je peux utiliser [AnyObject]:

let containers: [AnyObject] = [Container<Int>(1, 2, 3), Container<Double>(1.0, 2.0, 3.0)]
// Explicitly stating the types just for clarity.

Mais maintenant un autre problème surgit lors de l'énumération par containers:

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())
}
}

Comme vous pouvez le voir dans le code ci-dessus, après avoir déterminé le type de container la même méthode est appelée dans les deux cas. Ma question est:

Est-il un meilleur moyen d'obtenir le Container avec le bon type de casting pour chaque type de Container? Ou est-il autre chose que j'ai négligé?

  • ne serait pas l'utilisation de "Listes" être adapté ici? classe ContainterNode<T, W> { var head: ContainerNode<T> var suivante: ContainerNode<W>? }
InformationsquelleAutor ABakerSmith | 2015-04-22