WebView
インスタンス内のJavaScriptとの間で通信する場合WebViewDelegate
、JavaScriptタイプとObjective-Cタイプは相互に変換されます。たとえば、JavaScriptからObjective-C関数を呼び出すと、文字列は。になりNSString
、数値は。NSNumber
になり、オブジェクトは。になりWebScriptObject
ます。
他のものは扱いが非常に簡単ですが、WebScriptObject
奇妙に思えます。
のような辞書を渡すとき、私が見るコードのほとんどは、次のよう{"foo": 1, "bar": 2}
に、を使用してプロパティを抽出します。valueForKey
[[arg valueForKey:@"foo"] intValue] == 1
しかし、プロパティが存在するかどうかわからない場合はどうでしょうか。キーがオプションの場合はどうなりますか?[arg valueForKey:@"baz"]
例外をスローします。
私にできることの1つは
@try {
foo = [[arg valueForKey:@"baz"] intValue];
}
@catch (NSException* e) {
foo = 0;
}
しかし、Objective-Cの例外は安全ではなく、フロー制御に使用すべきではないと聞いています。
私が考えることができる他の唯一の方法は、ここで使用される方法のいくつかのバリエーションです:http: //edotprintstacktrace.blogspot.com/2011/10/sample-webscriptobject-javascript.html
言い換えると、1。を使用evaluateWebScript
して実装するJavaScript関数を定義しますObject.keys
。2。その関数を呼び出しますWebScriptObject
。3。返されたキーの配列を反復処理しvalueForKey
、一致するものが見つかった場合にのみ呼び出します。
これは私には信じられないほど非効率に思えます。もっと良い方法があるに違いない...ありますか?