Swift/iOS:当从Protocol进行类型转换时,如何访问Object属性



一些上下文优先:我正在为我的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关键字添加到属性声明中将解决此问题。

最新更新