Swift:反射NSManagedObject子类的属性

9

使用 Mirror 访问 NSManagedObject 子类的内部结构时,所有托管变量都会被忽略。

public class Foo: NSManagedObject {
   @NSManaged var bar: String?
}

var f: Foo = ...
// ... creating a Foo in a valid context ...

let mirror = Mirror(reflecting: f)
for c in mirror.children {        // children count == 0
  print("\(c.label!):\(c.value)") // never executed
}

NSManagedObjects如何使用反射机制?
1个回答

8
核心数据属性的存取方法是在运行时动态生成的。
您可以使用NSManagedObjectentity属性枚举核心数据实体的属性,该属性是NSEntityDescription并具有attributesByName属性。
一个简单的例子:
for (name, attr) in  newManagedObject.entity.attributesByName {
    let attrType = attr.attributeType // NSAttributeType enumeration for the property type
    let attrClass = attr.attributeValueClassName ?? "unknown"
    print(name, "=", newManagedObject.valueForKey(name), "type =", attrClass)
}

好的,没问题。实际上我需要子元素的类型,即使它们是空的。实体提示指向了这个方向。 - Guardian667
@Guardian667:你也可以从属性描述中获取类型。 - Martin R
NSAttributeDescription拥有一个NSAttributeType枚举成员。如何确定Any.Type的实际数据类型,而不实现NSAttributeType和Any.Type之间的映射? 另外:如果NSManagedObject-SubClass持有的成员也是NSManagedObject的子类,那么从NSAttributeType到特殊类型的映射将变得非常复杂。 - Guardian667
@Guardian667:attributeType返回在Core Data模型检查器中定义的类型枚举。attributeValueClassName给出用于表示对象的类的名称。同时也是托管对象的成员是关系,可以使用relationshipsByName进行枚举。- 你实际上想要实现什么? - Martin R
我正在进行反序列化对象的操作。通过调查目标类的MirrorChildren,来确定序列化对象中所需的值,例如:deserialize<T:NSObject>(serialized: String, type: T.Type)。一切都很顺利,直到使用NSManagedObject的子类时出现问题。至少有两个原因:a)我的算法需要NSObject的默认构造函数,而这个函数被NSManagedObject隐藏了。b)NSManagedObject在运行时动态合成属性,正如你所说,所以镜像没有子元素。 - Guardian667

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接