一些上下文优先:我正在为我的CoreData数据库构建一个通用的API。我的模型中的所有对象成对存在:
- 存储在CoreData中的NSManagedObject类,可以使用名为
ManagedObjectProtocol
的协议转换为NSObject - NSObject类,它实际上在我的应用程序中使用,可以通过名为
DataObject
的协议转换为NSManagedObject
我的管理对象协议
//MANAGED OBJECT PROTOCOL - Should be adhered to by all NSManagedObject classes
protocol ManagedObjectProtocol where Self: NSManagedObject {
//var managedObjectID: NSManagedObjectID { get set }
func populateRegularObject() -> DataObject
func populateRegularObjectFromRelated<T: TypeErasedDataObject>(relatedObject: T, at key: String) -> DataObject
}
在我的API中,我加载对象如下:
let managedObject = API.shared.persistentContainer.newBackgroundContext().object(with: someObjectID) as! ManagedObjectProtocol
let toReturn = managedObject.populateRegulardObject() //<-- This Crashes
问题:这成功加载了我的对象。我现在应该能够填充属于此ManagedObjectProtocol的DataObject,并在我的应用程序中使用它。但我做不到,因为很明显,对Protocol的类型转换加载对象的方式与将其类型转换为普通NSManagedObject
时不同。当我访问加载的ManagedObject的属性时,我的应用程序立即崩溃,并出现错误EXC_BAD_ACCESS
。
问题:当我需要将NSManagedObject类型转换为协议时,如何访问它的属性?
对我来说,能够做这样的事情是有意义的:
extension NSManagedObject where Self: ManagedObjectProtocol {
func populateDataObject() -> DataObject
}
但这不可能一蹴而就。有人能提出解决方案吗?如有任何帮助,我们将不胜感激。
下面的帖子将帮助您更好地理解问题
https://www.lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/
从本质上讲,核心数据似乎无法处理未经管理的协议。核心数据似乎重写了类定义,以通过代理方法传递@NSManaged,但对于协议无法这样做。
将dynamic
关键字添加到属性声明中将解决此问题。