MacOS - 使用 JSON 数组将条目添加到 SwiftUI 列表

MacOS - Using a JSON array to add entries to a SwiftUI list

前段时间问了一个涉及解码JSON。我正在使用此 JSON 在列表中创建条目并决定是否勾选复选框。 我之前的问题是如何解码 JSON,我有这段代码看起来很有用(如下),但老实说,我不知道该怎么做。

我应该把它放在 SwiftUI 文件的什么地方,我可以循环遍历 this 数组中的每个 JSON 并在 SwiftUI 中添加一个条目?

我有使用 Python 的经验,我知道应该如何完成,但在 swift 方面我是初学者...

我的代码:

struct Mod: Decodable {
    let id: String
    let display: String
    let description: String
    let url: String?
    let config: Bool?
    let enabled: Bool?
    let hidden: Bool?
    let icon: String?
    let categories: [String]?
    // let actions: Array<OptionAction>?
    // let warning: ActionWarning?
}

let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json")!

let task = URLSession.shared.dataTask(with: url) { (data, _, error) in
    if let error = error { print(error); return }
    do {
        let result = try JSONDecoder().decode([Mod].self, from: data!)
        print(result)
    } catch {print(error)}
}
task.resume()

let mods_test: () = importJSON(url: modsURL)
let enableds = mods_test.map {[=11=].enabled}

如果这个问题有什么不对的地方,请告诉我!在此先感谢您的帮助。

在这里,你可以怎么做,

你可以使用State声明变量

struct ContentView: View {

    //Declare variable
    @State var jsonDataList = [jsonData]()

    var body: some View {
        VStack {
            List(jsonDataList, id: \.id) { jsonDataList in
                VStack(alignment: .leading) {
                    HStack {
                        VStack(alignment: .leading) {
                            Text(jsonDataList.id)
                                .font(.title3)
                                .fontWeight(.bold)
                            Text(jsonDataList.display)
                                .font(.subheadline)
                                .fontWeight(.bold)
                        }
                        Spacer()
                        Image(systemName: jsonDataList.enabled ?? false ? "checkmark.square": "square")
                    }
                }
            }
            .onAppear(perform: loadData)
        }
    }

    //MARK: - Web Service

    func loadData() {

        guard let modsURL = URL(string: "https://raw.githubusercontent.com/nacrt/SkyblockClient-REPO/main/files/mods.json") else {
            print("Invalid URL")
            return
        }

        let task = URLSession.shared.dataTask(with: modsURL) { (data, _, error) in
            if let error = error { print(error); return }
            do {
                let result = try JSONDecoder().decode([jsonData].self, from: data!)
                jsonDataList = result
                print("Response:",jsonDataList)
            } catch {
                print(error)
            }
        }
        task.resume()
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
            ContentView()
    }
}

// MARK: - Data Model

struct jsonData: Codable, Identifiable {
    let id: String
    let display: String
    let description: String
    let url: String?
    let config: Bool?
    let enabled: Bool?
    let hidden: Bool?
    let icon: String?
    let categories: [String]?
}

响应截图: