Der folgende IOS-Code zeigt ein Beispiel dafür, wie Schlüssel-Arrays von einem Objekt in ein anderes innerhalb von JavaScriptCore für iOS zugewiesen und dann der Array-Operator auf dem Zielobjekt nach dem Kopieren verwendet wird. Ich habe auch gezeigt, wie man diese Objekte zwischen IOS Objective-C und JavaScriptCore sowohl als separate Javascript-Objekte, die von Objective-C gesetzt wurden, als auch indem das Objekt als Parameter an eine Javascript-Funktion übergeben wird.
JSContext *javascriptContext = [[JSContext alloc] init];
javascriptContext[@"consoleLog"] = ^(NSString *message) {
NSLog(@"Javascript log: %@",message);
};
NSDictionary *myArray = [NSDictionary dictionaryWithObjectsAndKeys:@0, @"item0", @1, @"item1", @2, @"item2", nil];
NSLog(@"myArray = %@", myArray);
javascriptContext[@"obj1"] = myArray;
[javascriptContext evaluateScript:@"var myFunction = function(arrayArg) {
consoleLog(\"obj1['item2'] = \" + obj1['item2']);
consoleLog(\"arrayArg['item0'] = \" + arrayArg['item0']);
var obj2 = obj1;
consoleLog(\"obj2['item1'] = \" + obj2['item1']);
obj1 = { 'key0': 0, 'key1': 1, 'key2': 2 };
obj2 = obj1;
consoleLog(\"obj2['key0'] = \" + obj2['key0']);
return obj2;
};"];
JSValue *function = javascriptContext[@"myFunction"];
NSArray *argList = [NSArray arrayWithObjects:myArray, nil];
JSValue *result = [function callWithArguments:argList];
NSDictionary *javascriptArray = [result toObject];
NSLog(@"javascriptArray returned = %@", javascriptArray);
Wenn Sie diesen Code kopieren, entfernen Sie bitte die eingebetteten Zeilenumbrüche in der Zeichenfolge, die die Javascript-Funktion enthält (ich habe diese für die Klarheit hinzugefügt).
Dieser Code gibt die folgende Konsolenausgabe zurück:
2014-02-07 16:49:55.901 TestHarness[4674:70b] myArray = {
item0 = 0;
item1 = 1;
item2 = 2;
}
2014-02-07 16:49:55.903 TestHarness[4674:70b] Javascript log: obj1['item2'] = 2
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: arrayArg['item0'] = 0
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['item1'] = 1
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['key0'] = 0
2014-02-07 16:49:55.905 TestHarness[4674:70b] javascriptArray returned = {
key0 = 0;
key1 = 1;
key2 = 2;
}
Wie Sie am Beispielcode sehen können, bietet das IOS JavaScriptCore-Framework eine integrierte Konvertierung zwischen dem NSDictionary-Objekt und Javascript-Arrays. Wenn man sich JSValue.h ansieht, beschreibt es diese integrierte Konvertierung als: NSDictionary konvertiert zu einem JavaScript-"Objekt", aber der Array-Operator funktioniert einwandfrei bei Werten, die von Objective-C injiziert wurden, und das für ein neues Javascript-Schlüssel-Array zurückgegebene Objekt ist ein gültiges NSDictionary-Objekt in Objective-C.
Löst das Ihr Problem oder habe ich es falsch verstanden?