Dire che ho una collezione di oggetti che ereditano da una superclasse comune (questo è preferibile protocolli in questo caso):generici Swift: Tipo di ritorno in base al tipo di parametro
class ObjectSuperClass {
type: ObjectType
}
class ObjectClass1: ObjectSuperClass {
type = .Type1
}
class ObjectClass2: ObjectSuperClass {
type = .Type2
}
Sto cercando di creare un generico funzione di ricerca simili:
func objectsOfType<T: ObjectSuperClass>(T.class, otherFilter: Any?) -> [T]
che potrebbero essere utilizzati per cercare un determinato sottotipo, restituendo un allineamento più preciso dei risultati:
let result = objectsOfType(ObjectClass2.class, otherFilter: nil) -> [ObjectClass2]
(pseudo-swift)
Mi sembra che da qualche parte i generici possano aiutare, ma non riescano a vedere dove devono essere posizionati i vincoli. È possibile?
Questo è bello, + 1.Out di curiosità, hai potuto fare uso di 'proprietà .dynamicType' a anche ordinare solo oggetti della superclasse? Ad esempio, 'filteredList3' nell'esempio sopra riportato per produrre solo' [] '? (Ad esempio: return list.filter {$ 0.dynamicType == T.self} .map {$ 0 as!T} 'non funziona, ma qualcosa del genere?) –
dfri
@dfri possibilmente. Non ho controllato Di solito non mi preoccupo perché, se non riesco a trattare oggetti di una sottoclasse come se fossero oggetti della classe base, lo prendo come un odore di codice che indica che il mio design di classe è sbagliato. – JeremyP
@dfri In realtà funziona. Devi solo dichiarare esplicitamente il parametro per il primo filtro come un 'AnyObject' i.e. return list.filter {(anObj: AnyObject) -> Bool in anObj.dynamicType == T.self} .map {$ 0 as! T} ' – JeremyP