Swift:@objc_block中的Variadic for JSContext中的函数

时间:2015-04-09 00:39:49

标签: swift javascriptcore

我在Swift中使用JavaScriptCore,并希望将javascript函数设置为swift objc_block。

这没有可变参数的效果很好:

var log : @objc_block (String, String, String) -> Void = { string1, string2, string3 in
   println("log:\(string1), \(string2), \(string3)")
 }
context.objectForKeyedSubscript("console").setObject(unsafeBitCast(log, AnyObject.self), forKeyedSubscript: "log");
// invoking console.log("arg1", "arg2", "arg3") will print log:arg1, arg2, arg3

但是使用可变参数我会收到错误:

var log : @objc_block (String...) -> Void = { string in
  // do some logging
}

JavaScript中引发的错误与context.exceptionHandler相关,是:

TypeError: Cannot convert primitive to NSArray

如果它试图将javascript(基元)中的参数转换为我在swift块中期望的数组,那么这是有意义的。要么JSContext中没有发生一些魔法,要么我做错了(我只使用swift几个小时)。

完整的代码是:

let context = JSContext()
context.evaluateScript("var window = this; var console = {};")
context.exceptionHandler = { context, exception in
  println("JS Error: \(exception)")
}
var log : @objc_block (String...) -> Void = { string in
  // do some logging
}
context.objectForKeyedSubscript("console").setObject(unsafeBitCast(log, AnyObject.self), forKeyedSubscript: "log");

1 个答案:

答案 0 :(得分:2)

你应该在ObjC / Swift中声明你的功能如下:

JSContext *context = [[JSContext alloc] init];
context[@"func"] = ^void() {
    NSArray *arguments = [JSContext currentArguments];
    ...
};
[context evaluateScript:@"func(2, 3, 4, 1)"];