I have a third party library class whose source is not open to me. For example like this:
class MyClass: NSObject {
let myProperty = 10
}
I can get myProperty
value like this.
let test = MyClass().value(forKey: "myProperty") // 10
I want to check whether myProperty
exists in MyClass
. Reason is I don't want my app to crash if the 3rd party class implementation changes in future.
For testing I've tried
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 { }
In every way I get crash.
*** 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.'
When valueForKey:
is invoked for an undefined key, the runtime forwards the call to valueForUndefinedKey:
. The default implementation of the later simply raises NSUndefinedKeyException
.
We can't catch the exception from Swift code, but we can override the method valueForUndefinedKey:
in an extension and return some error:
extension NSObject {
@objc
func value(forUndefinedKey key: String) -> Any {
NSError(domain: "Dynamic", code: 404, userInfo: [NSLocalizedDescriptionKey: "Accessing undefined key: '\(key)'"])
}
}
You must find a better solution by talking to lib dev
You can use Mirror reflection
and check its objects label
let myClass = Mirror(reflecting: MyClass())
for (_, attr) in myClass.children.enumerated() {
if let propertyName = attr.label, propertyName == "myProperty"{
print(propertyName, attr.value)
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With