在Swift中处理未捕获的异常valueForUndefinedKey

时间:2016-12-26 07:41:37

标签: ios swift error-handling runtime-error nsunknownkeyexception

我有第三方图书馆类,其来源不对我开放。例如:

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。'

2 个答案:

答案 0 :(得分:2)

当为未定义的键调用valueForKey:时,the runtime forwards the callvalueForUndefinedKey:。后者的默认实现只是引发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)
  }
}