将解码的JSON数据传递给SwiftUI ContentView
API调用和JSON解码工作正常,因为我可以毫无问题地打印JSON数据集中的任何项目以进行控制台操作 以下是API调用和测试打印:将解码的JSON数据传递给SwiftUI ContentView,swiftui,publish,observableobject,observedobject,Swiftui,Publish,Observableobject,Observedobject,API调用和JSON解码工作正常,因为我可以毫无问题地打印JSON数据集中的任何项目以进行控制台操作 以下是API调用和测试打印: import Foundation import SwiftUI import Combine class APICall : ObservableObject { @Published var summary: Summary? init () { pullSummary() } fu
import Foundation
import SwiftUI
import Combine
class APICall : ObservableObject {
@Published var summary: Summary?
init () {
pullSummary()
}
func pullSummary() {
let urlCall = URL(string: "https://api.covid19api.com/summary")
guard urlCall != nil else {
print("Error reaching API")
return
}
let session = URLSession.shared
let dataTask = session.dataTask(with: urlCall!) { (data, response, error) in
if error == nil && data != nil {
let decoder = JSONDecoder()
do {
let summary = try decoder.decode(Summary.self, from: data!)
print(summary.byCountry[40].cntry as Any)
DispatchQueue.main.async {
self.summary = summary
}
}
catch {
print("Server busy, try again in 5 min.")
}
}
}
dataTask.resume()
}
}
以下是用于解码的“摘要”数据模型的结构和数据对象结构:
import Foundation
struct Summary: Decodable {
let global: Global
let byCountry: [ByCountry]
let date: String
enum CodingKeys: String, CodingKey {
case global = "Global"
case byCountry = "Countries"
case date = "Date"
}
struct Global: Decodable {
let globalNC: Int
let globalTC: Int
let globalND: Int
let globalTD: Int
let globalNR: Int
let globalTR: Int
enum CodingKeys: String, CodingKey {
case globalNC = "NewConfirmed"
case globalTC = "TotalConfirmed"
case globalND = "NewDeaths"
case globalTD = "TotalDeaths"
case globalNR = "NewRecovered"
case globalTR = "TotalRecovered"
}
}
struct ByCountry: Decodable {
let cntry: String?
let ccode: String
let slug: String
let cntryNC: Int
let cntryTC: Int
let cntryND: Int
let cntryTD: Int
let cntryNR: Int
let cntryTR: Int
let date: String
enum CodingKeys: String, CodingKey {
case cntry = "Country"
case ccode = "CountryCode"
case slug = "Slug"
case cntryNC = "NewConfirmed"
case cntryTC = "TotalConfirmed"
case cntryND = "NewDeaths"
case cntryTD = "TotalDeaths"
case cntryNR = "NewRecovered"
case cntryTR = "TotalRecovered"
case date = "Date"
}
}
}
如图所示,使用ObserveableObject和@published根据需要发布API调用和JSON解码的结果
在ContentView中,我遵循了ObservedObject规则,只想在UI上显示JSON数据中的一个数据点,以确认其工作:
import SwiftUI
import Foundation
import Combine
struct ContentView: View {
@ObservedObject var summary = APICall()
var body: some View {
Text($summary.date)
.onAppear {
self.summary.pullSummary()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
}
但是。。。我在文本显示行中得到了这两个错误,1)初始值设定项'init(:)'要求'Binding'符合'StringProtocol'
,2)类型为'ObservedObject.Wrapper'的值没有使用根类型'APICall'的键路径的动态成员'date'。
我猜第二个错误是问题的根本原因,表明数据没有正确地传递到ContentView
我感谢你的建议
谢谢。这是一个内部属性混乱的视图模型
struct ContentView: View {
@ObservedObject var viewModel = APICall()
var body: some View {
Text(viewModel.summary?.date ?? "Loading...") // << no $ sign !!!
.onAppear {
self.viewModel.pullSummary()
}
}
}
struct ContentView:View{
@ObservedObject变量viewModel=APICall()
var body:一些观点{
文本(viewModel.summary?.date??“Loading…”)/它是一个带有内部属性的混乱视图模型
struct ContentView: View {
@ObservedObject var viewModel = APICall()
var body: some View {
Text(viewModel.summary?.date ?? "Loading...") // << no $ sign !!!
.onAppear {
self.viewModel.pullSummary()
}
}
}
struct ContentView:View{
@ObservedObject变量viewModel=APICall()
var body:一些观点{
Text(viewModel.summary?.date???“Loading…”)//Wow…谢谢,Asperi。它可以工作。谢谢。几个问题…编译器建议在错误对话框中用“Fix”将$符号放在那里。无论如何,我已经把它去掉了。我是初学者。你能解释一下“summary”之后的?和“date”之后的?吗?再次感谢!你说的“它是一个内部属性混乱的视图模型”是什么意思?谢谢。哇…谢谢,Asperi。它可以工作。谢谢。几个问题…编译器建议在错误对话框中用“修复”将$符号放在那里。不管怎样,我已经去掉了。我是一个初学者。你能解释一下“摘要”之后的吗还有“日期”之后的?再次感谢!你所说的“它是内部属性混乱的视图模型”是什么意思?谢谢。