处理 Swift 中未捕获的异常 valueForUndefinedKey
Handle uncaught exception valueForUndefinedKey in Swift
我有一个第三方库 class,它的源代码不对我开放。例如像这样:
class MyClass: NSObject {
let myProperty = 10
}
我可以这样得到 myProperty
值。
let test = MyClass().value(forKey: "myProperty") // 10
我想检查 myProperty
是否存在于 MyClass
中。原因是我不希望我的应用程序在 3rd 方 class 实现将来发生变化时崩溃。
为了测试我试过了
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 { }
我在各方面都崩溃了。
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__lldb_expr_80.MyClass 0x608000223a00>
valueForUndefinedKey:]: this class is not key value coding-compliant
for the key myProperty1.'
You must find a better solution by talking to 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)
}
}
当为未定义的键调用valueForKey:
时,the runtime forwards the call到valueForUndefinedKey:
。后者的默认实现只是引发 NSUndefinedKeyException
.
我们无法从 Swift 代码中捕获异常,但我们可以覆盖扩展中的方法 valueForUndefinedKey:
和 return 一些错误:
extension NSObject {
@objc
func value(forUndefinedKey key: String) -> Any {
NSError(domain: "Dynamic", code: 404, userInfo: [NSLocalizedDescriptionKey: "Accessing undefined key: '\(key)'"])
}
}
我有一个第三方库 class,它的源代码不对我开放。例如像这样:
class MyClass: NSObject {
let myProperty = 10
}
我可以这样得到 myProperty
值。
let test = MyClass().value(forKey: "myProperty") // 10
我想检查 myProperty
是否存在于 MyClass
中。原因是我不希望我的应用程序在 3rd 方 class 实现将来发生变化时崩溃。
为了测试我试过了
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 { }
我在各方面都崩溃了。
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__lldb_expr_80.MyClass 0x608000223a00> valueForUndefinedKey:]: this class is not key value coding-compliant for the key myProperty1.'
You must find a better solution by talking to 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)
}
}
当为未定义的键调用valueForKey:
时,the runtime forwards the call到valueForUndefinedKey:
。后者的默认实现只是引发 NSUndefinedKeyException
.
我们无法从 Swift 代码中捕获异常,但我们可以覆盖扩展中的方法 valueForUndefinedKey:
和 return 一些错误:
extension NSObject {
@objc
func value(forUndefinedKey key: String) -> Any {
NSError(domain: "Dynamic", code: 404, userInfo: [NSLocalizedDescriptionKey: "Accessing undefined key: '\(key)'"])
}
}