繁体   English   中英

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

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

我有一个函数,该函数调用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)

    ...
}

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

但是现在我Type 'T' does not conform to protocol 'Decodable'以下错误消息: 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)

    ...
}

没有完整的上下文,我无法确定您要从函数中返回什么,但是从泛型函数返回Promise<Any>绝对是个坏主意。 您应该使函数的返回类型也通用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM