Как использовать дженерики, чтобы вернуть все объекты для определенного типа NSManagedObject? - PullRequest
0 голосов
/ 27 сентября 2018

Это то, что мне нужно для достижения:

extension NSManagedObject {
    class func all<T: Self>(in context: NSManagedObjectContext) -> [T] { //error: Expected a class type or protocol-constrained type restricting '
        return mr_findAll(in: context) as! [T]
    }
}

И я бы хотел использовать это так:

let persons = Person.all(in: context)
let hotels = Hotel.all(in: context)

Возможно ли это вообще?

Person и Hotel наследуются от NSManagedObject.

1 Ответ

0 голосов
/ 27 сентября 2018

Поскольку запрос на выборку уже является общим, это может быть выполнено только с расширением протокола и связанным типом, расширение NSManagedObject не работает без приведения типа или аннотации.

protocol Managed
{
    associatedtype ManagedType: NSManagedObject = Self
    static var entityName : String { get }
    static func all(in context: NSManagedObjectContext) throws -> [ManagedType]
}

extension Managed where Self : NSManagedObject {
    static var entityName : String { return String(describing:self) }

    static func all(in context: NSManagedObjectContext) throws -> [ManagedType] {
        let request = NSFetchRequest<ManagedType>(entityName: entityName)
        return try context.fetch(request)
    }
}

Просто добавьтесоответствие Managed всем вашим NSManagedObject подклассам, тогда вы можете использовать

let persons = Person.all(in: context)
let hotels = Hotel.all(in: context)
...