我试图用来自Swift的回调来调用Javascript函数,但是我没有让它工作。
我拥有的是:
Javascript:
global.calculateWithCb = function(temp,cb){
cb(5 * temp)
}
global.calculate = function(temp) {
return 5 * temp
}
斯威夫特:
let context = JSContext()
let scriptURL = NSURL(fileURLWithPath: String("XXX/bundle.js"))
let script : String = try String(contentsOfURL:scriptURL, encoding: NSUTF8StringEncoding)
var jsSource: String! = script
jsSource = "var window = this; \(jsSource)"
context.evaluateScript(jsSource)
let calculate = context.objectForKeyedSubscript("calculate")
let output = calculate.callWithArguments([40]).toNumber()
因此计算函数的工作方式与预期的一样,但我真的不知道如何将块作为回调参数传递。我在网上搜索了很多,但我没有找到任何提示,也许有人可以指出我正确的方向?
答案 0 :(得分:0)
在作为参数调用之前,您需要使用@convention(block)
swift块手动初始化JSValue。
let testBlock : @convention(block) (JSValue?) -> Void = { calledBackValue in
print("calledBackValue:", calledBackValue)
}
let callback = JSValue.init(object: testBlock, in: context)
// ...
jsFunctionToCallWithCallback.call(withArguments: [42, callback])
var theJSFunction = function(val, callback) {
// Do smt...
callback(val);
}