swift - 尝试通过 URLSession 的完成处理程序返回数据
问题描述
我希望有人能提供帮助,我已经尝试了几个教程,我想我已经接近完成这项工作了。
我定义了一个结构,称为 Patient。它包含数十个键:值对,与来自 JSON 响应的信息相同。我可以在 Xcode 的控制台中打印此响应,它看起来不错。我想要做的是用 JSON 数据填充结构并通过完成处理程序返回它以用于应用程序的其余部分。
我不断绊倒的地方是返回填充的结构,下面的代码在完成块所在的位置给了我错误:
“无法将 '(Patient).Type' 类型的值转换为预期的参数类型 'Patient'”
我怀疑我只是很困惑,我错过了一些明显的东西。非常感谢任何帮助我完成此操作的帮助。
代码:
import Foundation
func getReturnA(doneStuffBlock: @escaping (Patient) -> Void) {
var patient: [Patient] = []
// set up URL request
guard let url = URL(string: "http://***.***.***.***/backend/returnA") else {
print("Can't create URL")
return
}
let urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) { (data, response, error) in
guard let data = data else {
print("Did not recieve data")
return
}
do {
let decoder = JSONDecoder()
let patient = try decoder.decode(Array<Patient>.self, from: data)
print(patient.self)
} catch let err {
print("Err", err)
}
doneStuffBlock(Patient)
}
task.resume()
}
解决方案
两个问题:
完成处理程序中的类型应该是一个数组
func getReturnA(doneStuffBlock: @escaping ([Patient]) -> Void) {
区分大小写很重要(类型
Patient
与变量名称patient
)。
建议以复数形式命名一个表示数组的变量,并在出错时返回一个空数组。var patient: [Patient] = []
... do { let decoder = JSONDecoder() let patients = try decoder.decode(Array<Patient>.self, from: data) print(patients) doneStuffBlock(patients) } catch { print("Err", error) doneStuffBlock([]) }
推荐阅读
- c# - C# 新的虚拟方法和 as/is 强制转换
- java - 如何允许/限制 textview 在 Android Studio 中仅显示小数点后的一个数字
- javascript - 在 JavaScript 中批量处理大型 JSON 数据集并将其发布到服务器
- javascript - Angular 7:从服务发送响应消息
- c# - .NET SDK for Azure 中 Get-AzureRmResource 的 C# 等效项是什么?
- php - 如何在我的 yii2 项目中修复“调用数组上的成员函数 offset()”错误
- html - Mysql - 检查约束以限制 HTML 代码或只允许表格列中的数字、字母、空格和连字符
- sql-server - UNION SELECT、并行化和 IDENTITY
- sql - ms-access中的sql
- html - 如何在水平模式下在全屏 WebApp 中运行时擦除移动 Safari 中的状态栏?