首页 > 请教使用 JavascriptCore 导出函数到 JS 环境,如果传递参数是 Object 时遇到的问题?

请教使用 JavascriptCore 导出函数到 JS 环境,如果传递参数是 Object 时遇到的问题?

如果我们想通过 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 的属性里就不知道怎么弄了。

请教这样的类型该如何处理呢?

【热门文章】
【热门文章】