繁体   English   中英

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

[英]How to use reflection with Core Data and Swift

我试图在Swift中将反射与Core Data实体一起使用,但是当我执行以下代码时,我的反射var仅具有超类的引用,而没有其任何属性的引用。

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
    }
}

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM