泛型类型“ T”不符合协议“可编码”

时间:2018-11-17 20:27:48

标签: swift codable

我试图迅速使用泛型来解释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”不符合协议“可编码”

如何正确使用它?

1 个答案:

答案 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'。