Swift/iOS:从协议转换类型时如何访问对象属性?

Swift/iOS:从协议转换类型时如何访问对象属性?,swift,core-data,protocols,generic-programming,swift-protocols,Swift,Core Data,Protocols,Generic Programming,Swift Protocols,先了解一些上下文: 我正在为我的CoreData数据库构建一个通用API。我的模型中的所有对象成对存在: 存储在CoreData中的NSManagedObject类,可通过名为ManagedObjectProtocol 一个NSObject类,在我的应用程序中实际使用,可以通过名为DataObject 我的ManagedObject协议 //MANAGED OBJECT PROTOCOL - Should be adhered to by all NSManagedObject classe

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

  • 存储在CoreData中的NSManagedObject类,可通过名为
    ManagedObjectProtocol
  • 一个NSObject类,在我的应用程序中实际使用,可以通过名为
    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
}

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

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

本质上,核心数据似乎无法处理非托管协议。核心数据似乎重写了类定义,以便通过代理方法传递@NSManaged,但无法对协议执行此操作


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

能否提供
object(with:)->NSManagedObject
方法的代码?能否提供一个?很难猜测为什么你的代码在没有更全面的实际代码的情况下崩溃。正如@Cristik所说,你应该发布实际代码或足够的代码来重现这个问题。我添加了一些基本代码。这里的问题实际上在于当对象的类型转换为它所遵循的协议时,访问对象的变量。嗨!感谢您提供的解决方案,但它无法解决我的问题。错误保持不变。我添加了更多的代码,为您提供了更多的见解。事实上,我并不认为这与NSManagedObject有关,因为我在其他对象中也体验到了这一点。当对象的类型转换为它所遵循的协议时,访问任何对象属性的问题似乎是通用的。你还有别的想法吗?
let managedObject = API.shared.persistentContainer.newBackgroundContext().object(with: someObjectID) as! ManagedObjectProtocol
let toReturn = managedObject.populateRegulardObject() //<-- This Crashes
extension NSManagedObject where Self: ManagedObjectProtocol {
    func populateDataObject() -> DataObject
}