swift - 为什么我的模板不适用于 JSONDecodable

标签 swift templates swift4 codable

我正在使用新的 Swift 4 Codable 接口(interface)从网络服务中简单地获取 JSON 数据。我试图实现一个通用类型方法来处理解码(因此我不需要自定义方法)但我一直收到错误。这是代码

extension StarWarsAPI {
public func decodeJson<T: Codable>(fetchUrl: URL, modelType: T, completion: @escaping (_ modelObject: Codable?, _ error:StarWarsErrorType?) -> Void){

    //guard modelType is Codable else {return completion(nil,nil)}

    var fetchRequest = URLRequest(url: fetchUrl, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)

    fetchRequest.httpMethod = "GET"
    fetchRequest.allHTTPHeaderFields = [
        "content-type": "application/json",
        "cache-control": "no-cache",
    ]

    let session = URLSession.shared
    let fetchDataTask = session.dataTask(with: fetchRequest) { (data, response, error) in

        guard error == nil else {
            return  completion(nil, StarWarsErrorType.urlResponseError(error: error))
        }
        guard let httpResponse = response as? HTTPURLResponse else {
            return  completion(nil, StarWarsErrorType.NilUrlResponseError())
        }
        guard let data = data else {
            return  completion(nil, StarWarsErrorType.noDataFound)
        }
        guard httpResponse.statusCode > 199 && httpResponse.statusCode < 300 else {
            return  completion(nil, StarWarsErrorType.httpErrorCode(code: httpResponse.statusCode))
        }
        var modelObject:Codable?
        do {

            let jsonDecoder = JSONDecoder()
            modelObject = try jsonDecoder.decode(modelType.self, from: data)
            return completion(modelObject, nil)
        }catch{ // do nothing }

            DispatchQueue.main.async {
                completion(nil, nil)
            }
        }
    }

    fetchDataTask.resume()
}

错误显示为“无法使用类型为‘(T, from: Data)’的参数列表调用‘解码’”。这是错误的屏幕截图。

我错过了什么?谢谢!

enter image description here

最佳答案

传递给 decode(_:from:) 的类型需要静态知道。 modelType.selfmodelType 的动态实例,但它的类型不受静态约束;您需要使用 T.self,这是静态已知类型。

关于swift - 为什么我的模板不适用于 JSONDecodable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47076604/

相关文章:

ios - 如何在swift 4中将导航动画从左到右更改?

json - Swift 4 Codable 解码数组用引号括起来

swift - @selector() 在 Swift 中?

具有默认模板参数的 C++14 变量模板?

c++ - 编译器看不到模板特化?

ios - 更新子字符串(到 :) results in generic parameter could not be inferred

swift - NSManagedObjectID 与自定义 UUID 标识符属性 - 获取性能

arrays - 为什么像这样对数组进行排序不起作用?

ios - 适用于 iOS 14.5 的 SwiftUI NavigationLink 无法正常工作

c++ - 如何确定 C++ 中实例化容器模板的容器模板类型