Say mam kolekcji obiektów dziedziczących od wspólnej nadrzędnej (jest to korzystne z protokołami w tym przypadku):Swift rodzajowych: typ zwracany w zależności od typu parametru
class ObjectSuperClass {
type: ObjectType
}
class ObjectClass1: ObjectSuperClass {
type = .Type1
}
class ObjectClass2: ObjectSuperClass {
type = .Type2
}
szukam stworzyć ogólny funkcja wyszukiwania tak:
func objectsOfType<T: ObjectSuperClass>(T.class, otherFilter: Any?) -> [T]
które mogłyby być użyte do wyszukania danego podtypu, wracając do bardziej szczegółowych tablicę wyników:
let result = objectsOfType(ObjectClass2.class, otherFilter: nil) -> [ObjectClass2]
(pseudo-swift)
Czuję, że to jest coś, co generycy mogą pomóc, ale nie widzą, gdzie należy umieścić ograniczenia. Czy to możliwe?
To jest ładne, + 1.Out ciekawości, można skorzystać z 'własności .dynamicType' nawet sortowania tylko obiekty superklasy? Np., 'FiltersList3' w twoim przykładzie powyżej, aby uzyskać tylko' [] '? (Np. 'Return list.filter {$ 0.dynamicType == T.self} .map {$ 0 as!T} 'nie działa, ale coś wzdłuż tych linii?) Prawdopodobnie –
dfri
@dfri. Nie sprawdziłem. Nie jest to coś, o co normalnie bym się martwił, ponieważ jeśli nie potrafię traktować obiektów podklasy tak, jakby były obiektami klasy bazowej, biorę to jako zapach kodu wskazujący, że mój projekt klasy jest niewłaściwy. – JeremyP
@dfri Właściwie to działa. Musisz tylko zadeklarować parametr dla pierwszego zamknięcia filtra jawnie jako 'AnyObject', tj.' Return list.filter {(anObj: AnyObject) -> Bool in anOj.dynamicType == T.self} .map {$ 0 as! T} ' – JeremyP