如何反映NSManagedObject的非托管属性



我正在搜索如何获得非托管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。(就像这个简单的(

编辑我已经找到了class_copyPropertyList函数的示例,它们可以正确地检索属性名称,但还没有找到如何获取类型感谢Tom Harrington的评论。(见样品(

我发现了许多使用NSEntityDescription获取托管对象的属性(或关系(的方法。(就像这个(。哪些工作并返回bicnumber但不返回lastOperation

已编辑更新代码样本以更好地匹配真实

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

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

感谢您的帮助

当您使用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

不久前,我写了一篇博客文章,描述了一些类似于你想要做的事情。代码在Objective-C中,但所有的函数、方法等都是一样的。

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

相关内容

  • 没有找到相关文章