Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将解码的JSON数据传递给SwiftUI ContentView_Swiftui_Publish_Observableobject_Observedobject - Fatal编程技术网

将解码的JSON数据传递给SwiftUI ContentView

将解码的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

API调用和JSON解码工作正常,因为我可以毫无问题地打印JSON数据集中的任何项目以进行控制台操作

以下是API调用和测试打印:

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。它可以工作。谢谢。几个问题…编译器建议在错误对话框中用“修复”将$符号放在那里。不管怎样,我已经去掉了。我是一个初学者。你能解释一下“摘要”之后的吗还有“日期”之后的?再次感谢!你所说的“它是内部属性混乱的视图模型”是什么意思?谢谢。