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的,遇到了这样的问题。
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!) })
}
}
}