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、一致するものが見つかった場合にのみ呼び出します。
これは私には信じられないほど非効率に思えます。もっと良い方法があるに違いない...ありますか?