无法使用类型为 '(T, from: Data)' 的参数列表调用'decode'



我正在尝试创建一个函数,该函数基于传递给它的自定义JSON模型,以'编码'的类型参数。错误:

 Cannot invoke 'decode' with an argument list of type '(T, from: Data)'

发生在解码线上,这是函数:

static func updateDataModels <T : Codable> (url: serverUrl, type: T, completionHandler:@escaping (_ details: Codable?) -> Void) {
guard let url = URL(string: url.rawValue) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
    guard let data = data else { return }
    do {
        let dataFamilies = try JSONDecoder().decode(type, from: data)// error takes place here
        completionHandler(colorFamilies)
    } catch let jsonErr {
        print("Error serializing json:", jsonErr)
        return
    }
    }.resume()
}

这是该函数参数中"类型"值的示例模型(使空间较小得多(:

struct MainDataFamily: Codable {
    let families: [Family]
    enum CodingKeys: String, CodingKey {
        case families = "families"
    }
}

类型T的类型是其元类T.Type,因此函数参数必须声明为type: T.Type

您可能还需要使完成手柄以T类型而不是Codable的参数:

static func updateDataModels <T : Codable> (url: serverUrl, type: T.Type,
         completionHandler:@escaping (_ details: T) -> Void) 

调用函数时,请使用 .self将类型传递给参数:

updateDataModels(url: ..., type: MainDataFamily.self) { ... }

相关内容

最新更新