我正在搜索如何获取非托管属性名称和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)。哪项工作并返回bic
和number
,但不是lastOperation
。
编辑 更新的代码示例以更好地与现实匹配
所以我的问题是:
如何在运行时动态返回我的lastOperation
属性及其类型?
编辑,我正在尝试做什么 我正在解析json,dnamically使用反射。 我需要知道其名称的属性的类型(或类型名称)(我有&#34; lastOperation&#34;,并且需要返回操作,或者&#34;操作&#34;)。一旦我得到了类型,我可以实例化一个对象,然后使用相同的机制(递归)填充自己的属性。
感谢您的帮助
答案 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中,但所有函数,方法等都是相同的。