Передайте NSDictionary из Javascript в Objective-c в 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, а вместо этого получаю NSString, содержащую [object Object].

Любые идеи, как я могу это решить?


person user4992124    schedule 28.03.2017    source источник
comment
Пожалуйста, добавьте к вопросу аналог кода Objective-C.   -  person Borys Verebskyi    schedule 28.03.2017
comment
@BorisVerebsky Я добавил!   -  person user4992124    schedule 28.03.2017


Ответы (1)


Хотя JavaScriptCore автоматически преобразует типы между Objective-C или Swift и JavaScript, я предлагаю реализовать явное преобразование. Автоматическое преобразование не всегда работает так, как может ожидать разработчик. Например, undefined преобразуется в @"undefined" в случае, когда используется NSString.

Попробуйте что-то вроде:

- (void)setDicationary:(JSValue *)jsDictionary {
    if ([jsDictionary isUndefined] || [jsDictionary isNull]) {
        jsDictionary = nil;
    }
    self.mutableDictionary = [jsDictionary toDictionary];
}

Обратите внимание, что JavaScript использует объект в качестве словаря, поэтому вы должны быть очень осторожны с аргументами, которые вы передаете коду Objective-C. Передача любого системного объекта приведет к рекурсивному преобразованию этого объекта в NSDictionary.

person Borys Verebskyi    schedule 28.03.2017