Arrays of Generics in Swift

Ich habe mit Arrays allgemeiner Klassen mit verschiedenen Typen herumgespielt. Es ist am einfachsten, mein Problem mit einem Beispielcode zu erklären:

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

Nun, wenn ich versuche, ein Array von Containern wie folgt zu erstellen:

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

Ich erhalte den Fehler:

Protocol 'MyProtocol' kann nur als generische Einschränkung verwendet werden, da Self- oder zugehörige Typanforderungen vorliegen.

Um dies zu beheben, kann ich[AnyObject]:

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

Aber jetzt taucht ein weiteres 'Problem' beim Aufzählen durch @ acontainers:

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

Wie Sie im obigen Code sehen können, nachdem Sie den Typ von @ bestimmt habcontainer In beiden Fällen wird dieselbe Methode aufgerufen. Meine Frage ist

Gibt es einen besseren Weg, um das @ zu bekommContainer mit dem richtigen Typ als Casting auf jeden möglichen Typ vonContainer? Oder gibt es noch etwas, das ich übersehen habe?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage