如果我们想通过 JavascriptCore 导出一个函数到 Javascript 中,这个 js 的函数调用的时候应该是这样的(只有一个参数)
share({
text:"test text",
url:"http://codingnext.com",
callback:function(){
console.log('test func');
}
});
那我们可以这样导出这个函数,由于参数是一个 Javascript Object ,所以我在 Swift 中定义为一个字典 [String:AnyObject]。
let block : @convention(block) ([String:AnyObject]) -> () = {
(d) -> () in
let text = d["text"] as? String ?? ""
let url = d["url"] as? String
let callback = d["callback"] as? JSValue
callback?.callWithArguments(nil)
}
self.js.setObject(unsafeBitCast(block, AnyObject.self), forKeyedSubscript: "share")
事实上,在 Swift 中获取 text,url 都是正确的,但是 callback 却是 nil ,后来我发现 d["callback"] 并不是 JSValue, 也不是 ()->(), 而是 _NSDictionaryM ,这个类型让我不知道改如何处理了,我发现他里面没有任何 key 和 value 。
所以我的问题在这个 Javascript Object 参数,如果这个 object 的有一个属性(这里的 callback)是 function object 的话(我不知道是不是这么称呼的),在 JavascriptCore 转换到 Swift 或者 Objective-C 过来不知道改如何处理了。
如果 不是这种 object 里包含一个 function object ,而是直接使用闭包作为参数的话,比如
share('test text','http://codingnext.com', function(){
console.log('test func');
});
那我在 Swift 中只要把这个参数类型定义为 JSValue,然后调用 callWithArguments(nil); 就可以了,而当把这个闭包放在 Object 的属性里就不知道怎么弄了。
请教这样的类型该如何处理呢?