ios - '[ResponseData]' 到预期的参数类型'ResponseData'
问题描述
我正在创建一个从 API 获取数据的应用程序。我在一个单独的类中创建了“API 调用”,因此我可以多次使用同一个调用。但它并没有像我期望的那样返回值。
在 ViewController A
let data = JsonData.init()
data.downloadJsonData(urlString: urlString) { (responseArray) in
dataArray.append(responseArray)
print(self.dataArray)
}
我在以下位置收到错误dataArray.append(responseArray)
:
无法将类型“[ResponseData]”的值转换为预期的参数类型“ResponseData”
在 JsonData 类中
class JsonData{
var dataArray:[ResponseData] = []
func downloadJsonData(urlString: String, completed: @escaping (Array<ResponseData>) -> ()){
guard let url = URL(string: urlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else{
return
}
do{
self.dataArray = [try JSONDecoder().decode(ResponseData.self, from: data)]
//Complete task in background
DispatchQueue.main.async {
completed(self.dataArray)
}
}
catch let jsonErr{
print(jsonErr)
}
}.resume()
}
}
我认为问题出在:
DispatchQueue.main.async{
completed(self.dataArray)
}
因此,一旦从 API 获取数据,我想将数组返回到正确的类。我做错了什么?任何帮助将非常感激。
解决方案
错误很明显:您正在使用(错误的)API 来附加单个元素
代替
dataArray.append(responseArray)
和
self.dataArray.append(contentsOf: responseArray)
边注:
设置并稍后再次附加项目没有意义。使用局部变量。
代替
self.dataArray = [try JSONDecoder().decode(ResponseData.self, from: data)]
//Complete task in background
DispatchQueue.main.async {
completed(self.dataArray)
}
with (不同的名字更清楚)
let result = try JSONDecoder().decode(ResponseData.self, from: data)
//Complete task in background
DispatchQueue.main.async {
completed([result])
}
推荐阅读
- javascript - 时间戳,剥离时间
- adodb - 将 ADODB 记录集复制到表中而不循环
- c# - asp.net:代码工作>添加了参考>获取错误>删除参考但仍然发生错误
- iis - IIS 即时弹出窗口
- java - 如何在 Apache Camel 文件组件编写的文件名中附加索引号?
- ios - textViewShouldBeginEditing 中的崩溃
- python - 尝试制作一个有效的上传按钮以将视频文件上传到本地视频文件夹
- oracle11g - 为什么我在 Sqoop 中收到连接重置错误?
- javascript - 试图为我的不和谐机器人发出抽奖命令,但不断返回未定义的获胜者
- java - Javalin sessionAttribute() 在请求之间不存在