«Как использовать кодируемый протокол для сетевого уровня» - PullRequest
0 голосов
/ 28 июня 2018

How to resolve this issue.......

Я пытаюсь создать сетевой слой для своего приложения, чтобы пройти проект

Я получаю ошибку

"Невозможно вызвать 'decode' со списком аргументов типа '(Codable, from: Data)'" Я думаю, что это происходит из-за типа ошибки или несоответствия. Помогите мне решить эту проблему

enum Type:String {
    case GET
    case POST
    case PUT
    case DELETE
}


func networkRequest(MethodType:Type, url:String, codableType:Codable) {

    guard let getUrl = URL(string: url) else {return}

    if MethodType == Type.GET  {

        URLSession.shared.dataTask(with: getUrl) { (data, response, err) in

            if let urlRes = response as? HTTPURLResponse{

                if 200...300 ~= urlRes.statusCode {

                    guard let data = data else {return}

                    do {
                        let newData = try JSONDecoder().decode(codableType.self, from: data)
                    }
                    catch let jsonerr {
                        print("Error Occured :"+jsonerr.localizedDescription)
                    }
                }


            }
        }.resume()

    }

}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Обобщения могут решить эту проблему.

Сначала введите параметр общего типа:

func networkRequest<T: Decodable>(MethodType:Type, url:String)
                   ^^^^^^^^^^^^^^

Теперь вы можете использовать T.self для типа для декодирования:

try JSONDecoder().decode(T.self, from: data)

Кроме того, вы можете рассмотреть возможность добавления обработчика завершения, иначе полученное вами значение будет потеряно:

func networkRequest<T: Decodable>(MethodType:Type, url:String, completionHandler: (T) -> Void)

Использование:

networkRequest(MethodType: .GET, url: ...) {
    (myStuff: MyType) in
    ...
}
0 голосов
/ 28 июня 2018

JSONDecoder ожидает конкретный тип, который соответствует Decodable. Протокол не может соответствовать самому себе.

Вы можете сделать метод универсальным

func networkRequest<T : Decodable>(MethodType: Type, url: String, codableType: T.Type) {
...
   let newData = try JSONDecoder().decode(T.self, from: data)

И назовите это

networkRequest(MethodType: .GET, 
                      url: "https://test.com/api", 
              codableType: News.self)
...