首页 > 解决方案 > 无法使用类型为“(模型类型:可解码,数据:数据)”的参数列表调用“解码响应”

问题描述

import Foundation
import UIKit

class CustomRequest {

  var sendingRequest: Codable;
  let url: URL
  var request: URLRequest;
  var device: UIDevice
  var responseMapper: Decodable

  init(request: Codable, url: String, mapper: Decodable){
      self.sendingRequest = request
      self.responseMapper = mapper;
      self.url = URL(string: url)!
      self.request = URLRequest(url: self.url)
      self.device = UIDevice.current
  }

  func send(){
      URLSession.shared.dataTask(with: self.request) {data, response, error in
          guard error == nil else {return print("NETWORK ERROR")}
          self.decodeResponse(modelType: self.responseMapper.self, data:data!)
      }
  }

  func decodeResponse<T>(modelType: T.Type, data: Data) where T:Decodable {
      JSONDecoder().decode(modelType, from: data)
  }
}

在这种情况下,我做错了什么?请帮我解决这个问题。我最近开始学习 swift 并遇到了这样的问题。

введите сюда описание изображения

标签: swift

解决方案


的类型responseMapper必须是具体类型。它不能是协议。

一种可能的解决方案是将泛型类型限制为Decodable.

你必须为数据任务添加一个完成处理程序

class CustomRequest<T : Decodable> {

    var sendingRequest: Codable;
    let url: URL
    var request: URLRequest;
    var device: UIDevice
    var responseMapper: T

    init(request: Codable, url: String, mapper: T){
        self.sendingRequest = request
        self.responseMapper = mapper;
        self.url = URL(string: url)!
        self.request = URLRequest(url: self.url)
        self.device = UIDevice.current
    }

    func send(completion: @escaping (Result<T,Error>) -> Void) {
        URLSession.shared.dataTask(with: self.request) { data, response, error in
            guard error == nil else { completion(.failure(error!)); return }
            completion(Result { try JSONDecoder().decode(T.self, from: data!) })
        }
    }
}

推荐阅读