检查类是否具有键的值

时间:2014-11-20 17:37:40

标签: swift foundation

我知道您可以使用setValue(value, forKey: key)设置Foundation类的属性,但是如何检查类是否具有键的值?

2 个答案:

答案 0 :(得分:4)

雷蒙德的回复

Swift3 版本

extension NSObject {
    func safeValue(forKey key: String) -> Any? {
        let copy = Mirror(reflecting: self)
        for child in copy.children.makeIterator() {
            if let label = child.label, label == key {
                return child.value
            }
        }
        return nil
    }
}

class A:NSObject {
    var name: String = "Awesome"
}

var a = A()
a.safeValue(forKey: "name") // "Awesome"
a.safeValue(forKey: "b")

答案 1 :(得分:1)

这是烦人的问题。在下面的代码片段中,我使用反射来检查对valueForObject的调用是否安全。它可能会有巨大的性能损失......

该解决方案受到blog post

的启发
extension NSObject {
    func safeValueForKey(key: String) -> AnyObject? {
        let copy = reflect (self)

        for index in 0 ..< copy.count {
            let (fieldName, fieldMirror) = copy[index]
            if (fieldName == key ){
                return valueForKey(fieldName)
            }

        }
        return nil
    }
}

class A:NSObject {
    var name: String = "Awesome"
}

var a = A()
a.safeValueForKey("name") // "Awesome"
a.safeValueForKey("b")    // nil