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 类型设为泛型。
我有一个函数调用 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 类型设为泛型。