如何反映 NSManagedObject 的非托管属性

How to reflect not managed properties of NSManagedObject

我正在搜索如何获取 not managed 属性 NSManagedObject 子类的名称和类型。

这里有一些示例代码可以帮助我提出问题:

 @objc(Operation)
    public class Operation : NSManagedObject {
         @NSManaged var name: String
         @NSManaged var amount: NSNumber
      }


  @objc(Account)
    public class Account: NSManagedObject {
        @NSManaged var bic: String
        @NSManaged var number: String

        @NSManaged var operations: Set<Operation>
        @NSManaged var servicesSubscriptions: Set<ServiceSubcription>

        // and more.
    }

    extension Account
    {

    public var lastOperation : Operation {
        get
        {
            return self.operations.last
        }
        set(value) 
        {    
            self.operations.insert(value)
        }
      }
    }

我找到了很多使用 reflect() 函数获取 属性 名称的方法。 reflect() 根本不适用于 NSManagedObject。 (like this simple one)

编辑 我找到了带有 class_copyPropertyList 函数的示例,可以正确检索 属性 名称,但还没有找到如何获取类型的示例。 感谢 Tom Harrington 的评论。 (see that sample)

我发现了很多使用 NSEntityDescription 获取托管对象的属性(或关系)的方法。 (like this one)。哪个工作并返回bicnumber但不是lastOperation

已编辑 更新代码示例以更好地符合现实

所以我的问题是: 如何在 运行 时间动态取回我的 lastOperation 属性 及其类型?

编辑,我想做什么 我正在解析 json,动态地使用反射。 我需要只知道其名称的 属性 的类型(或类型名称)(我有 "lastOperation",并且需要取回操作,或 "Operation")。一旦我得到类型,我就可以实例化一个对象,然后使用相同的机制(递归地)填充它自己的属性。

感谢您的帮助

我不知道 NSManagedObject 是什么时候。但是,我建议在模型内部创建 title 作为瞬态 属性,然后它将显示为实体描述的一部分。

当您使用 class_copyPropertyList 获取属性列表时,您可以遍历列表以依次查看每个 属性:

var propertyCount : UInt32 = 0
let properties = class_copyPropertyList(Account.self, &propertyCount)

for var i=0; i<Int(propertyCount); i++ {
    let property = properties[i]
    let propertyName = String(UTF8String: property_getName(property))
    ....
}

每个 属性 的类型包含在 属性 属性之一中,作为字符串:

    let propertyType = property_copyAttributeValue(property, "T")
    let propertyTypeString = String(UTF8String: propertyType)

对于您的 lastOperation 属性,字符串看起来类似于 @\"Operation\"。您必须稍微清理该字符串才能获得 Operation.

我刚才写 a blog post 描述了一些与您正在尝试做的事情类似的事情。代码在 Objective-C 但所有函数、方法等都是相同的。