Swift 4.2:类型'T'不符合协议'可解码'

gdu*_*duh 1 generics json swift codable

我有一个函数调用URL来接收数据作为JSON.要将JSON解码为自定义类,我使用JSONDecoder.

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)

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

但现在我收到以下错误消息:Type 'T' does not conform to protocol 'Decodable'在线:

dataFlux = try decoder.decode([T], from: data)
Run Code Online (Sandbox Code Playgroud)

我试图谷歌搜索消息,但现在没有任何成功.有什么建议可以解决这个问题吗?

Dáv*_*tor 6

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

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)

    ...
}
Run Code Online (Sandbox Code Playgroud)

如果没有完整的上下文,我无法确定你从函数返回什么,但从Promise<Any>泛型函数返回肯定是一个坏主意.您还应该将函数的返回类型设置为generic.

  • 不应该是`解码([T] .self,...)`? (2认同)