Тип Generics 'T' не соответствует протоколу 'Encodable' - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь использовать дженерики в быстром для интерпретации 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"

     }   ..

В слое My Network:

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]>>

Тип Generics 'T' не соответствует протоколу 'Encodable'

Как правильно использовать это?

1 Ответ

0 голосов
/ 17 ноября 2018

Несоответствие:

Должно быть HttpResponse<DATA: Decodable> вместо HttpResponse<DATA: Codable>, см. Определение Network<T: Decodable>.

Codable декларирует соответствие как Декодируемым, так и Кодируемым протоколам, см.определение Codable:

public typealias Codable = Decodable & Encodable

Таким образом, ваш HttpResponse ожидает универсальный, который соответствует как Decodable, так и Encodable протоколу.Но в определении сети используется общий тип, который соответствует только Decodable.Поэтому, как только компилятор проверяет сигнатуру метода getItems, он жалуется, что «T» не соответствует протоколу «Encodable».

...