如何使用泛型为特定类型的NSManagedObject返回所有对象?

时间:2018-09-27 10:59:18

标签: ios swift magicalrecord

这是我需要实现的:

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)

有可能吗?

PersonHotel继承自NSManagedObject

1 个答案:

答案 0 :(得分:3)

由于获取请求已经是通用的,因此只能使用协议扩展名和关联的类型来完成,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)