React Native Bridging:将JSON传递给Swift函数

时间:2016-11-29 21:52:43

标签: objective-c json swift react-native objective-c-swift-bridge

我是Swift和Objective-C的新手,但是我试图建立一个从React Native到Swift的桥梁,并将一个JSON和一个JSON数组作为参数发送给Swift。

Inside React我想调用这个函数:

startTrack('some url string', { artist: 'Bruce Springsteen', title: 'Born in the USA' }, [{ url: 'url', type: 'image' }, { url: 'another url', type: 'link' ]})

所以是一个字符串,一个对象和一个对象数组。

在我的网桥objective-c文件中,我有这个:

RCT_EXTERN_METHOD(startTrack:(NSString *)url trackinfo:(NSDictionary *)trackinfo slides:(NSDictionaryArray *)slides)

在我的swift文件中,我尝试了很多组合,但似乎没有任何结果:

  @objc func startTrack(url: String, trackinfo: [String: Any], slides: [[String: Any]]) {
    print("Play test", url, trackinfo, slides)
  }

我收到此错误消息: react native error message

如何将我的params一直发送到我的Swift文件?

由于

/彼得

2 个答案:

答案 0 :(得分:1)

您的Objective-c方法签名将trackingInfo设置为NSDictionary,但是您的Swift方法签名接受了Dictionary<String: Any>,因此这两个签名不匹配。

您必须重新编写方法并手动管理NSDictionary到Dictionary的演员表:

Objective-c

RCT_EXTERN_METHOD(startTrack:(NSString *)url trackinfo:(NSDictionary *)trackinfo slides:(NSDictionaryArray *)slides)

迅速

@objc func startTrack(url: String, trackinfo: NSDictionary, slides: [NSDictionary]) {
    guard let infoDictionary = trackinfo as? [String: Any],
          let slidesDictionary = slides as? [[String: Any]] else {
        return
    } 
    print("Play test", url, infoDictionary, slidesDictionary)
}

JS

startTrack(
  "some url string",
  { artist: "Bruce Springsteen", title: "Born in the USA" },
  [{ url: "url", type: "image" }, { url: "another url", type: "link" }]
);

**请注意,您在JS部分上有错字

答案 1 :(得分:0)

您的回答确实帮助了我很多,但仍然有一个问题

通过在行的开头的快速代码中添加_来解决此问题

@objc func startTrack(_ url: String, trackinfo: NSDictionary, slides: [NSDictionary]) {
guard let infoDictionary = trackinfo as? [String: Any],
      let slidesDictionary = slides as? [[String: Any]] else {
    return
    } 
print("Play test", url, infoDictionary, slidesDictionary)
}