Скажем, у меня есть коллекция объектов, наследующих от общего суперкласса (это предпочтительнее протоколов в данном случае):Swift дженерики: возвращение типа на основе типа параметра
class ObjectSuperClass {
type: ObjectType
}
class ObjectClass1: ObjectSuperClass {
type = .Type1
}
class ObjectClass2: ObjectSuperClass {
type = .Type2
}
Я ищу, чтобы создать общий функция поиска, как это:
func objectsOfType<T: ObjectSuperClass>(T.class, otherFilter: Any?) -> [T]
Который может быть использован для поиска данного подтипа, возвращая более конкретный массив результатов:
let result = objectsOfType(ObjectClass2.class, otherFilter: nil) -> [ObjectClass2]
(pseudo-swift)
Я чувствую, что это то, что может помочь генерация, но не может видеть, где должны быть помещены ограничения. Является ли это возможным?
Это хорошо, + 1.Out из любопытства, вы могли бы использовать '.dynamicType' собственности даже сортировать только объекты суперкласса? Например, 'filterList3' в вашем примере выше, чтобы получить только' [] '? (Например, 'return list.filter {$ 0.dynamicType == T.self} .map {$ 0 as!T} 'не работает, но что-то в этом роде?) –
dfri
@dfri возможно. Я не проверял. Это не то, о чем я обычно беспокоюсь, потому что, если я не могу рассматривать объекты подкласса, как если бы они были объектами базового класса, я воспринимаю это как запах кода, указывающий на неправильный дизайн моего класса. – JeremyP
@dfri На самом деле это работает. Вам просто нужно явно объявить параметр для первого закрытия фильтра как 'AnyObject' i.e.' return list.filter {(anObj: AnyObject) -> Bool в anObj.dynamicType == T.self} .map {$ 0 as! T} ' – JeremyP