JavascriptCore块的变量参数列表

时间:2014-02-11 03:49:20

标签: iphone ios7 objective-c-blocks javascriptcore

我想在JavascriptCore上下文中定义一个带有可变数量参数的函数。

这样的事情:

JSVirtualMachine* virtualMachine = [[JSVirtualMachine alloc] init];
JSContext* ctx = [[JSContext alloc] initWithVirtualMachine:virtualMachine];

ctx[@"func"] = ^(JSValue* value, ...){
    va_list args;
    va_start(args, value);
    for (JSValue *arg = value; arg != nil; arg = va_arg(args, JSValue*)) {
        NSLog( @"%@", arg);
    }
    va_end(args);
};

[ctx evaluateScript:@"func('arg1', 'arg2');"];

我相信JSC包装器不会将第二个参数传递给块,因为在记录第一个参数后迭代va_list崩溃。

我也尝试使用NSArray*约定,它不起作用。

这有可能吗?

2 个答案:

答案 0 :(得分:8)

来自JSContext.h:

// This method may be called from within an Objective-C block or method invoked
// as a callback from JavaScript to retrieve the callback's arguments, objects
// in the returned array are instances of JSValue. Outside of a callback from
// JavaScript this method will return nil.
+ (NSArray *)currentArguments;

通向以下内容:

ctx[@"func"] = ^{
    NSArray *args = [JSContext currentArguments];
    for (JSValue *arg in args) {
        NSLog( @"%@", arg);
    }
};

[ctx evaluateScript:@"func('arg1', 'arg2');"];

答案 1 :(得分:1)

我喜欢@ erm410的答案,我没有看过currentArguments的文档。

我采取的另一种方法是将JSON对象传递给Objective-C NSDictonary。这种方法的一个好处是你有命名参数 - 尽管你正在处理需要在调用和处理程序之间正确键入的字符串文字。

ctx[@"func"] = ^(NSDictionary *args) {
    NSLog(@"%@", args[@"arg1"];
};

[ctx evaluateScript:@"func({'arg1':'first','arg2':'second'})"];