gpt4 book ai didi

swift/iOS : How to access Object properties when type-casted from Protocol?

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:27 26 4
gpt4 key购买 nike

一些上下文优先:我正在为我的 CoreData 数据库构建一个通用 API。我模型中的所有对象都成对存在:

  • 存储在 CoreData 中的 NSManagedObject 类,可以使用名为 ManagedObjectProtocol 的协议(protocol)转换为 NSObject
  • 一个 NSObject 类,它实际上在我的整个应用程序中使用,并且可以使用名为 DataObject 的协议(protocol)转换为 NSManagedObject

我的托管对象协议(protocol)

//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

问题:当我需要将其类型转换为协议(protocol)时,如何访问我的 NSManagedObject 的属性?

对我来说,能够做这样的事情是有意义的:

extension NSManagedObject where Self: ManagedObjectProtocol {
func populateDataObject() -> DataObject
}

但这不能 swift 完成。谁能提出解决方案?任何帮助将不胜感激。

最佳答案

以下帖子将帮助您更好地理解问题

https://www.lesstroud.com/dynamic-dispatch-with-nsmanaged-in-swift/

从本质上讲,核心数据似乎无法处理不受管理的协议(protocol)。似乎核心数据重写了类定义以通过代理方法传递@NSManaged,但对于协议(protocol)无法这样做。

dynamic 关键字添加到您的属性声明中将解决此问题。

关于 swift/iOS : How to access Object properties when type-casted from Protocol?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com