6

ソースが公開されていないサードパーティのライブラリ クラスがあります。たとえば、次のようにします。

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' が原因でアプリを終了しています。

4

2 に答える 2

3

valueForKey:未定義のキーに対して が呼び出されると、ランタイムは呼び出しを に転送しますvalueForUndefinedKey:。後者のデフォルトの実装は単純に を発生させ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 に答える