一些上下文首先:,我正在为我的CoreData数据库构建一个通用的API。我的模型中的所有对象都是成对的:
ManagedObjectProtocol
。DataObject
。我的ManagedObject协议
//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
问题:成功地加载了我的对象。现在我应该能够填充属于这个DataObject的ManagedObjectProtocol,并在我的应用程序中使用它。但我不能这样做,因为显然,将类型转换到一个协议中,加载对象的方式与我将其作为一个普通的TypeCast加载时不同。当我访问已加载ManagedObject的属性时,我的应用程序会立即崩溃,出现错误EXC_BAD_ACCESS
。
问题:当我需要将NSManagedObject输入到协议中时,如何访问它的属性?
对我来说,做这样的事是有道理的:
extension NSManagedObject where Self: ManagedObjectProtocol {
func populateDataObject() -> DataObject
}
但这不可能很快完成。有人能提出解决办法吗?任何帮助都将不胜感激。
发布于 2018-11-14 05:53:56
下面的帖子将帮助你更好地理解这个问题。
https://www.lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/
本质上,核心数据似乎无法处理非管理的协议。似乎核心数据重写类定义以通过代理方法传递@NSManaged,但对于协议却无法这样做。
将dynamic
关键字添加到属性声明中将解决此问题。
https://stackoverflow.com/questions/53133017
复制相似问题