2015-12-22 91 views
3

當使用Mirror訪問NSManagedObject的子類的內部結構時,所有託管變量都將被忽略。Swift:反映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上使用反射機制。

回答

3

核心數據屬性的訪問器方法在運行時動態合成 。

可以使用 的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) 
} 
+0

好了,這很好。其實我需要孩子的類型,即使他們是零。該實體的提示會朝着這個方向發展。 – Guardian667

+0

@ Guardian667:您也可以從屬性描述中獲取類型。 –

+0

NSAttributeDescription具有NSAttributeType枚舉的成員。如何確定Any.Type的實際數據類型種類,而不實現NSAttributeType和Any.Type之間的映射。 另請參見:如果NSManagedObject-SubClass擁有一個也是NSManagedObject子類的成員,該怎麼辦?找到從NSAttributeType到特殊映射的映射會非常複雜。 – Guardian667