Generics Type 'T' does not conform to protocol 'Encodable'












1















I am trying to use generics in swift to intrepret http response. All The Json responses have the same signature at the top :



{
"request": "foo",
"result": "[{},{}....]
}


So I am using this :



public struct HttpResponse<DATA: Codable>  {
public let request: Bool?
public let result: DATA?

enum CodingKeys: String, CodingKey {
case request= "request"
case result = "result"

} ..


In My Network layer:



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)
})
}


I get this error in Observable<PlutusResponse<[T]>>




Generics Type 'T' does not conform to protocol 'Encodable'




How to correctly use this?










share|improve this question





























    1















    I am trying to use generics in swift to intrepret http response. All The Json responses have the same signature at the top :



    {
    "request": "foo",
    "result": "[{},{}....]
    }


    So I am using this :



    public struct HttpResponse<DATA: Codable>  {
    public let request: Bool?
    public let result: DATA?

    enum CodingKeys: String, CodingKey {
    case request= "request"
    case result = "result"

    } ..


    In My Network layer:



    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)
    })
    }


    I get this error in Observable<PlutusResponse<[T]>>




    Generics Type 'T' does not conform to protocol 'Encodable'




    How to correctly use this?










    share|improve this question



























      1












      1








      1








      I am trying to use generics in swift to intrepret http response. All The Json responses have the same signature at the top :



      {
      "request": "foo",
      "result": "[{},{}....]
      }


      So I am using this :



      public struct HttpResponse<DATA: Codable>  {
      public let request: Bool?
      public let result: DATA?

      enum CodingKeys: String, CodingKey {
      case request= "request"
      case result = "result"

      } ..


      In My Network layer:



      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)
      })
      }


      I get this error in Observable<PlutusResponse<[T]>>




      Generics Type 'T' does not conform to protocol 'Encodable'




      How to correctly use this?










      share|improve this question
















      I am trying to use generics in swift to intrepret http response. All The Json responses have the same signature at the top :



      {
      "request": "foo",
      "result": "[{},{}....]
      }


      So I am using this :



      public struct HttpResponse<DATA: Codable>  {
      public let request: Bool?
      public let result: DATA?

      enum CodingKeys: String, CodingKey {
      case request= "request"
      case result = "result"

      } ..


      In My Network layer:



      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)
      })
      }


      I get this error in Observable<PlutusResponse<[T]>>




      Generics Type 'T' does not conform to protocol 'Encodable'




      How to correctly use this?







      swift codable






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 17 '18 at 20:47







      Mohamed ALOUANE

















      asked Nov 17 '18 at 20:27









      Mohamed ALOUANEMohamed ALOUANE

      2,39821640




      2,39821640
























          1 Answer
          1






          active

          oldest

          votes


















          3














          There is a mismatch:



          It should be HttpResponse<DATA: Decodable> instead of HttpResponse<DATA: Codable>, see definition Network<T: Decodable>.



          Codable declares conformance to both Decodable and Encodable protocols, see the definition of Codable:



          public typealias Codable = Decodable & Encodable


          So your HttpResponse expects a generic that conforms to both Decodable and Encodable protocol. But in the definition of Network a generic that conforms only to Decodable is used. Therefore as soon as the compiler checks the method signature of getItems, it complains that 'T' does not conform to protocol 'Encodable'.






          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53355264%2fgenerics-type-t-does-not-conform-to-protocol-encodable%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            There is a mismatch:



            It should be HttpResponse<DATA: Decodable> instead of HttpResponse<DATA: Codable>, see definition Network<T: Decodable>.



            Codable declares conformance to both Decodable and Encodable protocols, see the definition of Codable:



            public typealias Codable = Decodable & Encodable


            So your HttpResponse expects a generic that conforms to both Decodable and Encodable protocol. But in the definition of Network a generic that conforms only to Decodable is used. Therefore as soon as the compiler checks the method signature of getItems, it complains that 'T' does not conform to protocol 'Encodable'.






            share|improve this answer






























              3














              There is a mismatch:



              It should be HttpResponse<DATA: Decodable> instead of HttpResponse<DATA: Codable>, see definition Network<T: Decodable>.



              Codable declares conformance to both Decodable and Encodable protocols, see the definition of Codable:



              public typealias Codable = Decodable & Encodable


              So your HttpResponse expects a generic that conforms to both Decodable and Encodable protocol. But in the definition of Network a generic that conforms only to Decodable is used. Therefore as soon as the compiler checks the method signature of getItems, it complains that 'T' does not conform to protocol 'Encodable'.






              share|improve this answer




























                3












                3








                3







                There is a mismatch:



                It should be HttpResponse<DATA: Decodable> instead of HttpResponse<DATA: Codable>, see definition Network<T: Decodable>.



                Codable declares conformance to both Decodable and Encodable protocols, see the definition of Codable:



                public typealias Codable = Decodable & Encodable


                So your HttpResponse expects a generic that conforms to both Decodable and Encodable protocol. But in the definition of Network a generic that conforms only to Decodable is used. Therefore as soon as the compiler checks the method signature of getItems, it complains that 'T' does not conform to protocol 'Encodable'.






                share|improve this answer















                There is a mismatch:



                It should be HttpResponse<DATA: Decodable> instead of HttpResponse<DATA: Codable>, see definition Network<T: Decodable>.



                Codable declares conformance to both Decodable and Encodable protocols, see the definition of Codable:



                public typealias Codable = Decodable & Encodable


                So your HttpResponse expects a generic that conforms to both Decodable and Encodable protocol. But in the definition of Network a generic that conforms only to Decodable is used. Therefore as soon as the compiler checks the method signature of getItems, it complains that 'T' does not conform to protocol 'Encodable'.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 17 '18 at 21:18

























                answered Nov 17 '18 at 20:59









                Stephan SchlechtStephan Schlecht

                4,8201810




                4,8201810






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53355264%2fgenerics-type-t-does-not-conform-to-protocol-encodable%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown