Ich habe mit Arrays von generischen Klassen mit verschiedenen Typen gespielt. Am einfachsten ist es mein Problem mit einigem Beispielcode zu erklären:Arrays von Generics in Swift
// 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, eine Reihe von Containern wie so zu erstellen:
var containers: [Container<MyProtocol>] = []
ich den Fehler:
Protocol 'MyProtocol' can only be used as a generic constraint because it has Self or associated type requirements.
Um das zu beheben, kann ich [AnyObject]
verwenden:
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 ein weiteres ‚Problem‘ entsteht, wenn durch containers
aufzählt:
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 oben im Code sehen können, nachdem die Art des container
die gleiche Methode der Bestimmung in beiden Fällen genannt wird. Meine Frage ist:
Gibt es einen besseren Weg, um die Container
mit dem richtigen Typ als Gießen zu jeder möglichen Art von Container
zu bekommen? Oder habe ich noch etwas übersehen?
Im OP war es nie nötig, den Container generisch zu machen. – Sulthan
Wenn das OP wollte, dass Container über ein Array von MyProtocol-Objekten verfügt, musste Container generisch sein, solange MyProtocol über eine erforderliche Werteigenschaft verfügte. –
Vielen Dank für Ihre Antwort.Leider habe ich 'Container' benötigt, um nur einen einzigen Typ zu speichern, aber das ist eine interessante Lösung, und ich bin mir sicher, dass ich später etwas davon dafür finden werde. – ABakerSmith