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 № 1Chociaż 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
.