2014-11-20 33 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")