/ / Przekaż NSDictionary z Javascript do Objective-c w JavascriptCore - javascript, ios, object-c, javascriptcore

Przekaż NSDictionary z JavaScript do Objective-c w JavascriptCore - javascript, ios, target-c, javascriptcore

Używam JavascriptCore w mojej aplikacji. Teraz przekazuję niektóre zmienne do JSContext które można następnie przekazać do celu C. Jednak jedna ze zmiennych, NSDictionary, nie przechodzi poprawnie. Uruchomiam poniższy kod:

var evaluate = function(variables) {
app.setDictionary(variables.dictionary);
}

Jest to prosty przykład, w którym skonfigurowano następujące metody JSContext.

To jest setDictionary() metoda:

- (void)setDicationary:(NSDictionary *)dictionary {
self.mutableDictionary = [dictionary mutableCopy];
}

To jest variables.dictionary:

- (NSDictionary *)dictionary {
return self.values;
}

I tak dzwonię evaluate():

JSValue *jsFunction = self.context[@"evaluate"];
JSValue *value = [jsFunction callWithArguments:@[self.variables]];

Jednak w metodzie setDictionary nie otrzymuję NSDictionary, ale zamiast tego otrzymuję NSString zawierający [object Object].

Jakieś pomysły, jak mogę to rozwiązać?

Odpowiedzi:

1 dla odpowiedzi № 1

Chociaż JavaScriptCore automatycznie konwertujetypy między Objective-C lub Swift i JavaScript, sugeruję wdrożenie jawnej konwersji. Automatyczna konwersja nie zawsze działa zgodnie z oczekiwaniami programistów. Na przykład undefined jest konwertowane na @"undefined" w przypadku kiedy NSString Jest używane.

Spróbuj czegoś takiego:

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

Pamiętaj, że JavaScript używa obiektu jako słownika,więc powinieneś być bardzo ostrożny z argumentami przekazywanymi do kodu Celu C. Przekazanie dowolnego obiektu systemowego spowoduje rekurencyjną konwersję tego obiektu na NSDictionary.