如何反映NSManagedObject的托管属性

时间:2015-08-12 12:53:34

标签: swift core-data reflection

我正在搜索如何获取非托管属性名称和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,dnamically使用反射。 我需要知道其名称的属性的类型(或类型名称)(我有&#34; lastOperation&#34;,并且需要返回操作,或者&#34;操作&#34;)。一旦我得到了类型,我可以实例化一个对象,然后使用相同的机制(递归)填充自己的属性。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

当谈到NSManagedObject时,我无法知道。但是,我建议在模型中创建title作为瞬态属性,然后它将显示为实体描述的一部分。

答案 1 :(得分:0)

当您使用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中,但所有函数,方法等都是相同的。