ios - API 未在 Swift for iOS 中显示数据
问题描述
目前没有从 API 获取数据来显示。
当前代码:
import SwiftUI
struct Response: Decodable {
var content: [Result]
}
struct Result : Decodable {
var code: String
var fire: String
var name: String
var police: String
var medical: String
}
struct ContentView: View {
@State private var content = [Result]()
var body: some View {
List(content, id: \.code) { item in
VStack(alignment: .leading) {
Text(item.name)
.font(.headline)
Text(item.medical)
}
}
.onAppear(perform: loadData)
}
func loadData() {
let url = URL(string: "https://emergency-phone-numbers.herokuapp.com/country/gb")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error { print(error); return }
do {
let decodedResponse = try JSONDecoder().decode(Response.self, from: data!)
// we have good data – go back to the main thread
DispatchQueue.main.async {
// update our UI
self.content = decodedResponse.content
}
} catch {
print(error)
}
}.resume()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
当前错误:
2021-01-21 19:21:07.094582+0000 iTunes API[39924:1098972] [] nw_protocol_get_quic_image_block_invoke dlopen libquic keyNotFound(CodingKeys(stringValue: "content", intValue: nil), Swift.DecodingError.Context(codingPath: [] ,debugDescription:“没有与键 CodingKeys 关联的值(stringValue:“content”,intValue:nil)(“content”)。”,underlyingError:nil))
请指教。提前致谢。
解决方案
请注意,来自的内容https://emergency-phone-numbers.herokuapp.com/country/gb
是:
{"code":"GB","fire":"999","police":"999","name":"United Kingdom","medical":"999"}
content
问题是您得到的响应中没有任何内容,因此JSONDecoder
无法解析响应。您获得的响应似乎包含适合的内容Result
,因此如果您更改代码以解析它,它可以正常工作:
import SwiftUI
struct Response: Decodable {
var content: [Result]
}
struct Result : Decodable {
var code: String
var fire: String
var name: String
var police: String
var medical: String
}
struct ContentView: View {
@State private var content = [Result]()
var body: some View {
List(content, id: \.code) { item in
VStack(alignment: .leading) {
Text(item.name)
.font(.headline)
Text(item.medical)
}
}
.onAppear(perform: loadData)
}
func loadData() {
let url = URL(string: "https://emergency-phone-numbers.herokuapp.com/country/gb")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error { print(error); return }
do {
let decodedResponse = try JSONDecoder().decode(Result.self, from: data!)
// we have good data – go back to the main thread
DispatchQueue.main.async {
// update our UI
self.content = [decodedResponse]
}
} catch {
print(error)
}
}.resume()
}
}
我想,最后,您可能希望 s 的集合Result
适合content
,因此您可能需要更改您的 API 上的某些内容以返回该集合,然后您的代码就可以正常工作。
推荐阅读
- javascript - node.js SyntaxError:无效或意外的令牌
- python-3.x - 将类实例存储在 python 列表中
- javascript - 如何根据 JSON 文件中的布尔值自动添加过滤器
- function - 映射函数应用于列表的特定元素
- ffmpeg - 如何使用 ffmpeg 查找音频流
- java - 模拟firebase android应用程序
- python - 在 IBM Watson Studios 上加载 json 文件
- flutter - 如何在不显示键盘的情况下聚焦 TextField?
- java - 从数据库表中填充 Java HashMap
- labview - LabVIEW:(取消)按名称捆绑并交换颜色