微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

前段时间,我问了一个涉及解码 JSON 的 question。我正在使用此 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 {$0.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]?
}

响应截图:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。