swift - 无法使用类型为“(模型类型:可解码,数据:数据)”的参数列表调用“解码响应”
问题描述
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!) })
}
}
}
推荐阅读
- java - 结果说明
- rcpp - 快速确定整数向量的近似最大值
- javascript - 无法理解字段 ExtJS6.2 的渲染器
- ansible - 有没有办法解决这个“debconf-show”路径问题?
- ansible - win_find 失败!=> {"msg": "'dict object' 没有属性 'files'"}
- pandas - Pandas - 如何删除日期时间列转换中的空格以避免错误?
- kivy - 我无法运行此代码,但在 sentdex 教程中它可以工作
- wpf - Prism - Shell 作为 UserControl 并从 WPF 应用程序初始化引导程序
- csv - 有没有办法自动组合位于 SharePoint 上的多个 csv 文件(无需每天早上运行 jupyter notebook 代码)
- ruby-on-rails - 如何在活动管理员的另一个表单的(视图)中显示表的数据?