首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift/iOS:如何在从协议中键入类型时访问对象属性?

Swift/iOS:如何在从协议中键入类型时访问对象属性?
EN

Stack Overflow用户
提问于 2018-11-03 15:58:38
回答 1查看 403关注 0票数 1

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

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

我的ManagedObject协议

代码语言:javascript
运行
复制
//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中,我按如下方式加载对象:

代码语言:javascript
运行
复制
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输入到协议中时,如何访问它的属性?

对我来说,做这样的事是有道理的:

代码语言:javascript
运行
复制
extension NSManagedObject where Self: ManagedObjectProtocol {
    func populateDataObject() -> DataObject
}

但这不可能很快完成。有人能提出解决办法吗?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-11-14 05:53:56

下面的帖子将帮助你更好地理解这个问题。

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

本质上,核心数据似乎无法处理非管理的协议。似乎核心数据重写类定义以通过代理方法传递@NSManaged,但对于协议却无法这样做。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53133017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档