Swift:@objc_block 中的 Variadic 用于 JSContext 中的函数

标签 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 block 中期望的数组,这就有意义了。要么 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");

最佳答案

您应该在 ObjC/Swift 中声明您的函数如下:

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

关于Swift:@objc_block 中的 Variadic 用于 JSContext 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29527776/

相关文章:

uiwebview - 如何从 WKWebView 获取 JSContext

ios - Admob Banner 广告在 SpriteKit 切换场景时变为 Nil

iOS:如何知道 reloadData() 已完成其任务?

react-native - 如何在 React Native android 应用程序中使用 JavaScriptCore

javascript - 在 javascript 中, "for .. in"语句如何产生副作用?

ios - 下载 Javascript 以在 UIWebView 与 JavascriptCore 中执行

ios - 使用 UIWebView 播放视频时出错

swift - NSCollectionView 数据源无法正常工作

ios - Objective C 到 Swift - DoWithBlock

xcode - 从 JavaScript 调用 swift 方法挂起 xcode 和应用程序