我有一个函数,该函数调用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)
我尝试搜索该邮件,但目前未成功。有解决该问题的建议吗?
答案 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)
...
}
绝对是个坏主意。您应该将函数的返回类型也设为通用。