我在我的应用程序中使用 JavascriptCore
。现在,我将一些变量传递给 JSContext
,然后这些变量可以传递回 Objective-C。但是,其中一个变量 NSDictionary 没有正确传递。我运行下面的代码:
var evaluate = function(variables) {
app.setDictionary(variables.dictionary);
}
这是一个简单的示例,在 JSContext
中设置了以下这些方法。
这是 setDictionary()
方法:
- (void)setDicationary:(NSDictionary *)dictionary {
self.mutableDictionary = [dictionary mutableCopy];
}
这是variables.dictionary
:
- (NSDictionary *)dictionary {
return self.values;
}
这就是我调用 evaluate()
的方式:
JSValue *jsFunction = self.context[@"evaluate"];
JSValue *value = [jsFunction callWithArguments:@[self.variables]];
但是,在 setDictionary 方法中,我没有得到 NSDictionary,而是得到了一个包含 [object Object]
的 NSString。
有什么办法可以解决这个问题吗?
最佳答案
尽管 JavaScriptCore 会自动在 Objective-C 或 Swift 与 JavaScript 之间进行类型转换,但我建议实现显式转换。自动转换并不总是像开发人员期望的那样工作。例如,当使用 NSString
时,undefined
被转换为 @"undefined"
。
尝试这样的事情:
- (void)setDicationary:(JSValue *)jsDictionary {
if ([jsDictionary isUndefined] || [jsDictionary isNull]) {
jsDictionary = nil;
}
self.mutableDictionary = [jsDictionary toDictionary];
}
请注意,JavaScript 使用对象作为字典,因此您应该非常小心传递给 Objective-C 代码的参数。传递任何系统对象将导致该对象递归转换为 NSDictionary
。
关于javascript - 将 NSDictionary 从 Javascript 传递到 JavascriptCore 中的 Objective-c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43066204/