在 JavascriptCore 中将 NSDictionary 从 Javascript 传递到 Objective-c
Pass NSDictionary from Javascript to Objective-c in JavascriptCore
我在我的应用程序中使用 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
.
我在我的应用程序中使用 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]
.
有什么解决办法吗?
虽然 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
.