这是我需要实现的:
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
。
答案 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)