【问题标题】:Swift generics and AnySwift 泛型和 Any
【发布时间】:2022-07-14 13:04:46
【问题描述】:

我正在快速使用 SignalR,我正在尝试订阅不同的功能。

文档说 (https://github.com/moozzyk/SignalR-Client-Swift)

"值得注意的是,处理程序参数的类型必须是 指定并且必须与发送的值的类型兼容 服务器(例如,如果服务器使用字符串调用方法 处理程序的参数类型不能是 Int)。处理程序数量 参数应与用于调用 来自服务器端的客户端方法。

所以我对参数唯一了解的是它们符合可解码,所以这是我处理它们的通用函数。

 private func subscribe<T:Decodable>(_ hubConnection: HubConnection, _ methodName: String, _ callback: @escaping ([T?])->()) {
        switch expectedParametersCount {
        case 2:
            hubConnection.on(method: methodName) { arg1, arg2 in
                        self.addAction({ callback([arg1, arg2])})
            }
            break
  }

这是我调用订阅函数并遇到麻烦的地方

private func hubConnSubscribe(_ hubConnection: HubConnection) {
        for kvPair in methodSubscriptions {
            subscribe(hubConnection, kvPair.key, kvPair.value)
        }
    }

但是当我尝试存储它们时遇到了问题:这是我的字典。

private var methodSubscriptions = [String : ([Any?])->()]()

这给了我错误

Protocol 'Any' 作为类型不能符合 'Decodable'

如果我把它改成

[String : ([Decodable?])->()]()

然后我得到

Protocol 'Decodable' 作为一种类型不能符合协议本身

所以我的问题是我的字典应该是什么样子?

【问题讨论】:

    标签: swift generics decodable


    【解决方案1】:

    如果我正确理解了这个问题,您需要方法 subscribe() "kvPair.value" 来接收符合“Decodable”的内容
    在我看来,你有两个行动方案。 由于 Any 不符合“可解码”,您可以:

    1. 让“methodSubscriptions”类获得一个符合“Decodable”的泛型类型,如下所示:

      class SomeClass<T:Decodable> {
      
          private var methodSubscriptions = [String : ([T?])->()]()
      
      }
      
    2. 您可以使用更简单的方法使“methodSubscriptions”“Decodable”而不是“Any”,如下所示:

      private var methodSubscriptions = [String : ([Decodable?])->()]()
      

    希望对你有帮助:)

    【讨论】:

    • 我实际上尝试将其更改为 [Decodable?] 但是当我这样做时,我在尝试捕获 arg1 的地方收到错误“协议'Decodable'作为一种类型不能符合协议本身”, arg2 在我的回调中。我编辑了问题以详细说明。
    • 在这种情况下,我建议尝试我的第一个建议。这样,您将拥有一个符合“可解码”的具体类型
    【解决方案2】:

    我最终使用了一个泛型函数并根据需要添加了一个泛型值,就像这样。

     private func invoke<T: Encodable, U: Encodable>(_ methodName: String, _ callBack: Any?, _ callbackState: Any?, expectedArgs: Int,
                                                        _ arg1: T? = nil, _ arg2: U? = nil, _ arg3: T? = nil, _ arg4: T? = nil) {...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      相关资源
      最近更新 更多