6

我有一个第三方库类,它的源不对我开放。例如像这样:

class MyClass: NSObject {
    let myProperty = 10
} 

我可以得到myProperty这样的价值。

let test = MyClass().value(forKey: "myProperty")  // 10

我想检查是否myProperty存在于MyClass. 原因是如果 3rd 方类的实现在未来发生变化,我不希望我的应用程序崩溃。

为了测试我试过

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 的键值编码不兼容。”

4

2 回答 2

3

valueForKey:为未定义的键调用时,运行时会将调用转发valueForUndefinedKey:. 后者的默认实现只是 raises NSUndefinedKeyException

我们无法从 Swift 代码中捕获异常,但我们可以覆盖valueForUndefinedKey:扩展中的方法并返回一些错误:

extension NSObject {
    @objc
    func value(forUndefinedKey key: String) -> Any {
        NSError(domain: "Dynamic", code: 404, userInfo: [NSLocalizedDescriptionKey: "Accessing undefined key: '\(key)'"])
    }
}
于 2020-04-15T15:51:58.590 回答
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)
  }
}
于 2016-12-26T08:12:49.220 回答