2014-11-20 4 views

ответ

1

Это раздражающая проблема. В следующем фрагменте кода я использую отражение, чтобы проверить, безопасен ли вызов valueForObject. Это может иметь огромное снижение производительности ...

Раствор был вдохновлен этой версией ответ Raymond «s 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

+0

Как я уже сказал в комментарии, это возвращает необязательное значение, если вы собираетесь его использовать, вы должны проверить его на nil. –

+1

Нет, он падает, если вы используете неопределенный ключ – Okapi

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