我正在搜索如何获得非托管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获取托管对象的属性(或关系(的方法。(就像这个(。哪些工作并返回bic
和number
,但不返回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
创建为模型内部的瞬态属性,然后它将显示为实体描述的一部分。