我知道您可以使用setValue(value, forKey: key)
设置Foundation类的属性,但是如何检查类是否具有键的值?
答案 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