我有第三方图书馆类,其来源不对我开放。例如:
class MyClass: NSObject {
let myProperty = 10
}
我可以得到myProperty
这样的价值。
let test = MyClass().value(forKey: "myProperty") // 10
我想检查myProperty
中是否存在MyClass
。原因是如果第三方类的实现在将来发生变化,我不希望我的应用程序崩溃。
为了测试,我尝试了
guard let test = MyClass().value(forKey: "myProperty1") else { return } // crash
if let test = MyClass().value(forKey: "myProperty1") { } // crash
do {
let test = try MyClass().value(forKey: "myProperty1") // crash
} catch { }
在各方面我都会崩溃。
***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[< __ lldb_expr_80.MyClass 0x608000223a00> valueForUndefinedKey:]:此类不符合键值编码 对于关键的myProperty1。'
答案 0 :(得分:2)
当为未定义的键调用valueForKey:
时,the runtime forwards the call至valueForUndefinedKey:
。后者的默认实现只是引发NSUndefinedKeyException
。
我们无法从Swift代码中捕获异常,但是我们可以在扩展名中覆盖方法valueForUndefinedKey:
并返回一些错误:
extension NSObject {
@objc
func value(forUndefinedKey key: String) -> Any {
NSError(domain: "Dynamic", code: 404, userInfo: [NSLocalizedDescriptionKey: "Accessing undefined key: '\(key)'"])
}
}
答案 1 :(得分:1)
您必须通过与lib dev
交谈找到更好的解决方案
您可以使用Mirror reflection
并检查其对象标签
let myClass = Mirror(reflecting: MyClass())
for (_, attr) in myClass.children.enumerated() {
if let propertyName = attr.label, propertyName == "myProperty"{
print(propertyName, attr.value)
}
}