无法使用类型为'(modelType:Decodable,data:Data)'的参数列表调用'decodeResponse'

问题描述 投票:1回答:1
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
1个回答
0
投票

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!) })
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.