【问题标题】:Unable to infer closure type in the current context (SwiftSignalRClient)无法在当前上下文中推断闭包类型 (SwiftSignalRClient)
【发布时间】:2021-03-07 01:08:28
【问题描述】:

我创建了一个新项目并正在尝试实现 SwiftSignalR 框架。在我的上一个项目中,以下代码没有问题。但是,在新项目中,我遇到了一个闭包类型错误,并且真的需要一些帮助!

实际错误为:无法在当前上下文中推断闭包类型

除了我从 Swift 4.2 切换到 Swift 5.0 和 iOS 部署目标从 12.0 切换到 13.0 之外,我真的不明白为什么现在出现这个错误,而不是在我之前的项目中出现这个错误

我的代码如下:

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { locationUpdate, _ in
        self.locationUpdateReceived(locationUpdate as! [Dictionary<String, Any>])
    }

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, Any>]) {
    print("Location update recieved")
}

【问题讨论】:

标签: swift signalr closures


【解决方案1】:

这个问题似乎是由 SignalR-Client-Swift API 的变化引起的,早期的预期是 [Any?] 和 TypeConverter 类型的两个参数,现在它具有 ArgumentExtractor 和一堆泛型重载。一般来说,你的新代码看起来像这样

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { extractor in
    let locationUpdate = try extractor.getArgument(type: [Dictionary<String, Any>].self)
    self.locationUpdateReceived(locationUpdate)
}

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, Any>]) {
    print("Location update recieved")
}

但是,这还不能编译,因为新的 api 需要 Decodable 类型,所以你不能在这里使用 Any 并将其更改为其他类型,所以代码应该如下所示:

struct LocationInfo: Codable {
    var value: String
}

private var connection: HubConnection

connection.on(method: "LocationBroadcast") { extractor in
    let locationUpdate = try extractor.getArgument(type: [Dictionary<String, LocationInfo>].self)
    self.locationUpdateReceived(locationUpdate)
}

private func locationUpdateReceived(_ locationUpdate: [Dictionary<String, LocationInfo>]) {
    print("Location update recieved")
}

【讨论】:

  • 感谢您抽出宝贵时间查看此内容。我尝试了您的建议,但不幸的是私有函数 locationUpdateReceived 从未收到位置更新。
  • @Chris getArgument 有例外吗?您能否提供导致问题的更新代码?
  • 不,没有例外,但是当 SignalR 消息通过时,它永远不会调用 locationUpdateReceived 函数。好消息是没有错误,代码构建得非常好。现在我只需要确保当消息通过时,我可以提取字典数据并对其进行处理。就好像 getArgument 失败了,但没有例外。
  • @Chris 这似乎不太可能,一旦执行到达 getArgument,如果出现异常或崩溃,就不会调用 locationUpdateReceived。您是否尝试在那里捕获异常?
【解决方案2】:

对于 Swift Codable,我正在使用它。

private var connection: HubConnection

connection.on(method: "LocationBroadcast", callback: { (jsonResponse: JSON) in
            print(jsonResponse)

            do {
                let locationBroadcast:LocationBroadcast = try JSONDecoder().decode(LocationBroadcast.self, from: jsonResponse.rawData())
            }catch(let error) {
                print(error.localizedDescription)
            }
        })

struct LocationBroadcast: Codable {
    var value: String
}

【讨论】:

    【解决方案3】:

    制作 pod 版本为

    pod 'SwiftSignalRClient', '~> 0.5.0'

    这已经解决了问题,而无需为我更改代码。

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2018-11-08
      • 2019-05-14
      • 1970-01-01
      • 2017-02-11
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多