Sagen wir, ich habe eine Sammlung von Objekten aus einem gemeinsamen übergeordneten Klasse erben (dies ist vorzuziehen Protokolle in diesem Fall):Swift Generika: Rückgabetyp auf Basis von Parametertyp
class ObjectSuperClass {
type: ObjectType
}
class ObjectClass1: ObjectSuperClass {
type = .Type1
}
class ObjectClass2: ObjectSuperClass {
type = .Type2
}
Ich suche eine generisch zu schaffen Suchfunktion wie folgt aus:
func objectsOfType<T: ObjectSuperClass>(T.class, otherFilter: Any?) -> [T]
die verwendet werden könnten für einen bestimmten Untertyp zu suchen, eine spezifischere Array von Ergebnissen der Rückkehr:
let result = objectsOfType(ObjectClass2.class, otherFilter: nil) -> [ObjectClass2]
(pseudo-swift)
ich so das Gefühl, irgendwo Generika könnte helfen, aber kann nicht sehen, wo Einschränkungen platziert werden soll. Ist es möglich?
Das ist schön, + 1.Out Neugier, könnte man die Verwendung von '.dynamicType' Eigenschaft sogar Art machen nur Objekte der Oberklasse aus? Z. B. 'filteredList3' in Ihrem Beispiel oben ergeben nur' [] '? (Zum Beispiel 'return list.filter {$ 0.dynamicType == T.self} .map {$ 0 wie!T} 'funktioniert nicht, aber etwas in diese Richtung?) –
dfri
@dfri möglicherweise. Ich habe es nicht überprüft. Normalerweise mache ich mir darüber keine Sorgen, denn wenn ich Objekte einer Unterklasse nicht so behandeln kann, als wären sie Objekte der Basisklasse, nehme ich das als einen Code-Geruch, der anzeigt, dass mein Klassendesign falsch ist. – JeremyP
@dfri Eigentlich funktioniert es. Sie müssen nur den Parameter für den ersten Filterabschluss explizit als ein 'AnyObject' deklarieren, d. H.' Return list.filter {(anObj: AnyObject) -> Bool in einemObj.dynamicType == .self} .map {$ 0 as! T} ' – JeremyP