在WebView
实例中的 JavaScript 和 a之间进行通信时WebViewDelegate
,JavaScript 类型和 Objective-C 类型会来回转换。例如,当从 JavaScript 调用 Objective-C 函数时,字符串变为NSString
,数字变为NSNumber
,对象变为WebScriptObject
。
其他的很容易处理,但WebScriptObject
看起来很奇怪。
当传递一个像这样的字典时{"foo": 1, "bar": 2}
,我看到的大多数代码都是使用提取属性的valueForKey
,例如在[[arg valueForKey:@"foo"] intValue] == 1
但是,如果您不确定该属性是否存在怎么办?如果键是可选的怎么办?[arg valueForKey:@"baz"]
抛出异常。
我能做的一件事是
@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
在找到匹配项时调用。
对我来说,这似乎非常低效。一定有更好的方法……有吗?