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

2015-10-21 21:13:01 +08:00
 adow

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

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

2316 次点击
所在节点    iDev
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX