Swift 4.2:类型 'T' 不符合协议 'Decodable'

Swift 4.2 : Type 'T' does not conform to protocol 'Decodable'

我有一个函数调用 URL 来接收数据 JSON。 要将 JSON 解码为自定义 class,我使用 JSON 解码器。

fileprivate func loadFlux<T>(_ typeClass: T.Type, urlCriteria url: String) -> Promise<Any> {

    var dataFlux: [T]? = nil
    var promise: Promise<Any>? = nil

    ...

    let jsonData: Data = try! JSONSerialization.data(withJSONObject: data as! NSArray)

    let decoder = JSONDecoder()
    dataFlux = try decoder.decode([T], from: data)

    ...
}

在安装最新版本 Xcode 和 swift 4.2 之前,代码构建没有任何问题。

但现在我得到以下错误信息:Type 'T' does not conform to protocol 'Decodable' 就行了:

dataFlux = try decoder.decode([T], from: data)

我尝试用谷歌搜索该消息,但暂时没有成功。有什么解决该问题的建议吗?

即使在以前的 Swift 版本上也无法编译该代码,因为 JSONDecoder.decode 期望其输入参数符合 Decodable 并且您没有设置类型约束。您只需要将 T 限制为 Decodable.

fileprivate func loadFlux<T:Decodable>(_ typeClass: T.Type, urlCriteria url: String) -> Promise<Any> {

    var dataFlux: [T]? = nil
    var promise: Promise<Any>? = nil

    ...

    let jsonData: Data = try! JSONSerialization.data(withJSONObject: data as! NSArray)

    let decoder = JSONDecoder()
    dataFlux = try decoder.decode([T].self, from: jsonData)

    ...
}

如果没有完整的上下文,我无法确定您从函数中 return 得到了什么,但是从通用函数中 return 得到 Promise<Any> 绝对不是一个好主意。您还应该将函数的 return 类型设为泛型。