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

时间:2018-02-07 20:31:48

标签: ios swift generics swift4 codable

我正在尝试创建一个函数,该函数根据传递给它的自定义JSON模型接受“Codable”类型的参数。错误:

(condition) ? if true : if not true

发生在解码行,这是函数:

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

这是用于函数参数中'type'值的示例模型(为节省空间而小得多):

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()
}

1 个答案:

答案 0 :(得分:13)

类型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) { ... }