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?