Я знаю, что вы можете установить свойства классов Foundation с помощью setValue(value, forKey: key)
, но как вы можете проверить, имеет ли класс значение для ключа?Проверьте, имеет ли класс значение для ключа
3
A
ответ
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)
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")
это подбрасывает если ключ не был определен – Okapi
Как я уже сказал в комментарии, это возвращает необязательное значение, если вы собираетесь его использовать, вы должны проверить его на nil. –
Нет, он падает, если вы используете неопределенный ключ – Okapi