我的建议有些不同。它使用 静态 方法
在子类上调用
loadFromDB和。好处是,始终返回关联的类型,而无需任何其他类型强制转换。
fetch``NSManagedObject
另一个变化是
throw错误。由于Core Data
API广泛依赖于
throw错误,因此我建议删除
CoreDataResult<Value>。所有错误均已通过。成功返回对象,失败返回错误。
我省略了
id相关的代码和
update方法。您可以添加一个
static func predicate(for id : ID)
protocol CoreDataWriteManagerProtocol { associatedtype ManagedObject : NSManagedObject = Self static var persistentContainer : NSPersistentContainer { get } static var entityName : String { get } static func loadFromDB(predicate: NSPredicate?) throws -> ManagedObject static func fetch(request: NSFetchRequest<ManagedObject>) throws -> ManagedObject static func insertNewObject() -> ManagedObject}extension CoreDataWriteManagerProtocol where Self : NSManagedObject { static var persistentContainer : NSPersistentContainer { return (UIApplication.delegate as! AppDelegate).persistentContainer } static var entityName : String { return String(describing:self) } static func loadFromDB(predicate: NSPredicate?) throws -> ManagedObject { let request = NSFetchRequest<ManagedObject>(entityName: entityName) request.predicate = predicate return try fetch(request: request) } static func fetch(request: NSFetchRequest<ManagedObject>) throws -> ManagedObject { guard let results = try? persistentContainer.viewContext.fetch(request) else { throw CoreDataResponseError.fetch(entityName: entityName) } if let result = results.first { return result } else { throw CoreDataResponseError.idDoesNotExist } } static func insertNewObject() -> ManagedObject { return NSEntityDescription.insertNewObject(forEntityName: entityName, into: persistentContainer.viewContext) as! ManagedObject }}


