【问题标题】:How to reference a generic Decodable struct in Swift 4如何在 Swift 4 中引用通用的可解码结构
【发布时间】:2018-04-08 06:58:35
【问题描述】:

我有一个想要重用的函数,并让它接受 Decocable 结构的参数。例如,这是我当前代码的简化(假设“MyDecodableStruct”是应用程序其他地方声明的可解码结构):

 static func getResults(url: String, parameters: Parameters) {
    // On success REST response
     if response.result.isSuccess {
        struct Results: Decodable {
          let items: [MyDecodableStruct]
         }

      if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
        //success
    }
}

而不是说“MyDecodableStruct”,我希望它是我作为参数传入的任何可解码结构。像这样的:

 static func getResults(url: String, parameters: Parameters, myStruct: Decodable) {
    // On success REST response
     if response.result.isSuccess {
        struct Results: Decodable {
          let items: [myStruct]
         }

      if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
        //success
    }
}

我会这样称呼它

 getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct)

我无法弄清楚如何让它工作的语法。我得到的错误是

Type 'Results' does not conform to protocol 'Decodable'
Expected element type

关于处理此问题的最佳方法的任何想法?

【问题讨论】:

    标签: struct swift4 decodable


    【解决方案1】:

    当你想将一个类型作为参数传递时,你需要将参数的类型声明为metatype。在您的情况下,它是一个需要符合 Decodable 的泛型类型。

    所以你可能需要这样写:

    struct Results<Element: Decodable>: Decodable {
        let items: [Element]
    }
    static func getResults<Element: Decodable>(url: String, parameters: Parameters?, myStruct: Element.Type) {
        //...
            // On success REST response
            if response.result.isSuccess {
    
                do {
                    let jsonResults = try JSONDecoder().decode(Results<Element>.self, from: response.data!)
                    //success
                    print(jsonResults)
                } catch {
                    //Better not dispose errors silently
                    print(error)
                }
            }
        //...
    }
    

    Swift 说类型不能嵌套在泛型上下文中,所以我将它移到外部非泛型上下文中。

    称它为:

    getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct.self)
    

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2018-12-03
      • 1970-01-01
      • 2022-01-22
      • 2019-03-13
      • 2019-04-26
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多