Поскольку запрос на выборку уже является общим, это может быть выполнено только с расширением протокола и связанным типом, расширение 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)