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

时间:2018-10-01 16:28:54

标签: json swift generics 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)

    ...
}

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

但是现在我得到以下错误消息:Type 'T' does not conform to protocol 'Decodable'在行上:

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

我尝试搜索该邮件,但目前未成功。有解决该问题的建议吗?

1 个答案:

答案 0 :(得分:6)

该代码甚至在以前的Swift版本中也无法编译,因为 self.entry.bind( '<ButtonRelease>', self.selecttext ) def selecttext(self, event): try: print( 'selection = ', self.entry.selection_get() ) except tk.TclError: pass 期望其输入参数符合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) ... } 绝对是个坏主意。您应该将函数的返回类型也设为通用。