Cannot invoke 'decodeResponse' with an argument list of type '(modelType: Decodable, data: Data)'
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
addDeviceHeaders()
}
func addDeviceHeaders(){
let deviceUDID = device.identifierForVendor?.uuidString
self.request.addValue(device.name, forHTTPHeaderField: "device-name")
if (deviceUDID != nil) {
self.request.addValue(deviceUDID!, forHTTPHeaderField: "device-udid")
}
}
func get() -> CustomRequest {
self.request.httpMethod = "GET"
return self;
}
func post() -> CustomRequest {
self.request.httpMethod = "POST"
return self
}
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, подскажите что я делаю не так!?
Ответы (1 шт):
Автор решения: schmidt9
→ Ссылка
У вас тут несколько ошибок
- Для передачи в параметре типа нужно передавать конкретный тип. Это
значит, что нужно создать свой класс, использующий протокол
Decodable - Поскольку метод
JSONDecoder().decodeкидает исключение, мы должны его обработать в месте вызова или передать исключение выше и обработать его уже там (я выбрал второе) guard error == nil else {return print("NETWORK ERROR")}- такprintне будет вызван
Исправленный вариант
class CustomRequest {
class ResponseMapper: Decodable {
}
var sendingRequest: Codable;
let url: URL
var request: URLRequest;
var device: UIDevice
var responseMapper: ResponseMapper
init(request: Codable, url: String, mapper: ResponseMapper){
self.sendingRequest = request
self.responseMapper = mapper;
self.url = URL(string: url)!
self.request = URLRequest(url: self.url)
self.device = UIDevice.current
addDeviceHeaders()
}
func addDeviceHeaders(){
let deviceUDID = device.identifierForVendor?.uuidString
self.request.addValue(device.name, forHTTPHeaderField: "device-name")
if (deviceUDID != nil) {
self.request.addValue(deviceUDID!, forHTTPHeaderField: "device-udid")
}
}
func send(){
URLSession.shared.dataTask(with: self.request) {data, response, error in
if let error = error {
print("NETWORK ERROR \(error.localizedDescription)")
return
}
do {
try self.decodeResponse(modelType: ResponseMapper.self, data:data!)
} catch {
// TODO: Handle error
}
}
}
func decodeResponse<T>(modelType: T.Type, data: Data) throws -> T where T:Decodable {
try JSONDecoder().decode(modelType, from: data)
}
}
