2014-11-20 32 views

回答

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 
0

valueForKey(key:String)是func的名称。

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

var a = A() 

a.setValue("John", forKey: "name") 
a.valueForKey("name") //returns an optional value (AnyObject) 
+0

这引发了一个错误如果密钥没有被定义 – Okapi 2014-11-20 18:02:57

+0

正如我在评论中所说,这返回一个可选值,如果你打算使用它,你应该检查零。 – 2014-11-21 12:30:10

+1

不,它崩溃,如果你使用一个未定义的键 – Okapi 2014-11-21 16:33:31

3

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")