如何在 Core Data 和 Swift 中使用反射

How to use reflection with Core Data and Swift

我试图在 Swift 中对核心数据实体使用反射,但是当我执行以下代码时,我的反射变量只有一个超级 class 的引用,它没有它的任何属性都没有参考。

func printProperties() {
    let mirror = reflect(self)
    for var i = 0; i < mirror.count; i++ {
        let (propertyName, childMirror) = mirror[i]
        println("property name: \(propertyName)")
        println("property value: \(childMirror.value)")
    }
}

有人知道为什么会这样吗?


更新:正如安德森在他的回答中所建议的那样,我尝试了另一种方法并最终得到了这段代码:

func loadFromJson(json: JSON) {
    for attributeKey in self.entity.attributesByName.keys {
        let attributeDescription = self.entity.propertiesByName[attributeKey]!
            as! NSAttributeDescription
        let attributeClassName = attributeDescription.attributeValueClassName
        let jsonValue = json[(attributeKey as! String)]
        var attributeValue: AnyObject? = attributeDescription.defaultValue
        if jsonValue.type != .Null && attributeClassName != nil {
            if attributeClassName == "NSNumber" {
                attributeValue = jsonValue.number!
            } else if attributeClassName == "NSString" {
                attributeValue = jsonValue.string!
            }
        }
        setValue(attributeValue, forKey: (attributeKey as! String))
    }
}

相信这段代码可以帮到你。 我写了这个扩展来从 NSmanagedObject 中创建一个字典,它访问对象的所有属性和值。

extension NSManagedObject {

    func toDict() -> Dictionary<String, AnyObject>! {

        let attributes = self.entity.attributesByName.keys
        let relationships = self.entity.relationshipsByName.keys
        var dict: [String: AnyObject] = [String: AnyObject]()
        var dateFormater = NSDateFormatter()
        dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ss"

        for attribute in attributes {
            if self.entity.propertiesByName[attribute]!.attributeValueClassName != nil && self.entity.propertiesByName[attribute]!.attributeValueClassName == "NSDate" {
                let value: AnyObject? = self.valueForKey(attribute as! String)
                if value != nil {
                    dict[attribute as! String] = dateFormater.stringFromDate(value as! NSDate)
                } else {
                    dict[attribute as! String] = ""
                }

            } else {
                let value: AnyObject? = self.valueForKey(attribute as! String)
                dict[attribute as! String] = value
            }
        }

        for attribute in relationships {
            let relationship: NSManagedObject = self.valueForKey(attribute as! String) as! NSManagedObject
            let value = relationship.valueForKey("key") as! String
            dict[attribute as! String] = value
        }

        return dict
    }
}

希望对你有所帮助。