如何反映 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)。哪个工作并返回bic
和number
,但不是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 但所有函数、方法等都是相同的。
我正在搜索如何获取 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)。哪个工作并返回bic
和number
,但不是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 但所有函数、方法等都是相同的。