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