如何在 Class/func 和 View 之间传输数据

How to transfer data between Class/func and View

我从 API 中解码了 json 数据,现在我想将解码后的数据传输到我的视图中以显示它。

问题是我无法使用@Observable 对象将解码数据传输到我的视图。

我的解码 class 看起来像这样:

class apirefresh: ObservableObject {

@Published var datareturn : DataClass

func refreshData() {
        let url = URL(string: "http://localhost:3000/Data")!
    
        url.getResult { (result: Result<DataClass, Error>) in
            switch result {
            case let .success(dataout):
                self.datareturn = dataout
                print(dataout)
                //print(dataout.klasse[0].aktive[0].name) //dataout.klasse[0].aktive[0].name
            case let .failure(error):
                print(error)
            }
        }
    }
}

我的错误是这样的: Class Error

我的视图中也出现错误,但这个错误似乎与之前的错误有关。

View Error

我的 json 模型如下所示:

// MARK: - APICall
struct APICall: Codable {
    let data: DataClass

    enum CodingKeys: String, CodingKey {
        case data = "Data"
    }
}

// MARK: - DataClass
struct DataClass: Codable {
    let klasse: Klasse
    let update: Update
}

// MARK: - Klasse
 struct Klasse: Codable {
    let aktive, bjugend, cjugend, djugend: [Verein]
    let ejugend, fjugend, bambini: [Verein]
}

// MARK: - Aktive
struct Verein: Codable {
    let id, place: String
    let name: String
    let tore, punkte: String
    let gruppe: String
}

// MARK: - Update
struct Update: Codable {
    let last: String
}

提前感谢您的帮助。

问题是 class 中的 datareturn 没有初始值,这就是编译器要求 class 初始化程序的原因,您可以在其中给出 datareturn一个初始值。所以你必须这样做:

class apirefresh: ObservableObject {

@Published var datareturn : DataClass

init(datareturn: DataClass) {
    self.datareturn = datareturn
}

func refreshData() {
        let url = URL(string: "http://localhost:3000/Data")!
    
        url.getResult { (result: Result<DataClass, Error>) in
            switch result {
            case let .success(dataout):
                self.datareturn = dataout
                print(dataout)
                //print(dataout.klasse[0].aktive[0].name) //dataout.klasse[0].aktive[0].name
            case let .failure(error):
                print(error)
            }
        }
    }
}

或者使 datareturn 成为可选的(这使得它的初始值 nil)。

class apirefresh: ObservableObject {

@Published var datareturn : DataClass?

func refreshData() {
        let url = URL(string: "http://localhost:3000/Data")!
    
        url.getResult { (result: Result<DataClass, Error>) in
            switch result {
            case let .success(dataout):
                self.datareturn = dataout
                print(dataout)
                //print(dataout.klasse[0].aktive[0].name) //dataout.klasse[0].aktive[0].name
            case let .failure(error):
                print(error)
            }
        }
    }
}