我试图迅速使用泛型来解释http响应。所有Json响应的顶部都具有相同的签名:
{
"request": "foo",
"result": "[{},{}....]
}
所以我正在使用它:
public struct HttpResponse<DATA: Codable> {
public let request: Bool?
public let result: DATA?
enum CodingKeys: String, CodingKey {
case request= "request"
case result = "result"
} ..
在“我的网络”层中:
final class Network<T: Decodable> {
func getItems(_ path: String) -> Observable<HttpResponse<[T]>> {
let absolutePath = "\(endPoint)/\(path)"
return RxAlamofire
.data(.get, absolutePath)
.debug()
.observeOn(scheduler)
.map({ data -> [T] in
return try JSONDecoder().decode([T].self, from: data)
})
}
我在Observable<PlutusResponse<[T]>>
泛型类型“ T”不符合协议“可编码”
如何正确使用它?
答案 0 :(得分:3)
不匹配:
应为HttpResponse<DATA: Decodable>
而不是HttpResponse<DATA: Codable>
,请参阅定义Network<T: Decodable>
。
Codable声明同时符合Decodable和Encodable协议,请参阅Codable的定义:
public typealias Codable = Decodable & Encodable
因此,您的HttpResponse需要一个既符合Decodable协议又符合Encodable协议的泛型。但是在网络的定义中,使用了仅符合“可解码”的泛型。因此,编译器一旦检查getItems
的方法签名,就会抱怨'T'不符合协议'Encodable'。