Ответ 1
Это суть того, что я использую для подобной функции, обратите внимание, что это расширение на NSManagedObjectContext
, а не NSManagedObject
. Возможно, что-то подобное можно было бы сделать на NSManagedObject
protocol NamedManagedObject {
class func entityName() -> String;
}
extension NSManagedObjectContext {
func fetchObjects<T:NSManagedObject where T:NamedManagedObject>(entity:T.Type, predicate:NSPredicate? = nil, sortDescriptors:NSSortDescriptor[]? = nil) -> T[]? {
let request = NSFetchRequest(entityName: entity.entityName())
request.predicate = predicate
request.sortDescriptors = sortDescriptors
var error:NSError? = nil
let results = self.executeFetchRequest(request, error: &error) as? T[]
assert(error == nil)
return results
}
}
extension MyObjectClass : NamedManagedObject {
class func entityName() -> String {
return "MyObjectClass"
}
}
Тогда его использование выполняется так же просто, как:
let objects = managedObjectContext.fetchObjects(MyObjectClass)
Обратите внимание, что вы также можете реализовать NamedManagedObject для всех NSManagedObjects с помощью:
extension NSManagedObject : NamedManagedObject {
class func entityName() -> String {
return NSStringFromClass(self)
}
}
Если вы также гарантируете, что все ваши классы явно заданы дружественными именами Objective-C:
@objc(MyManagedObject)
class MyManagedObject : NSManagedObject { ... }