SwiftUI:按名称分组数据并显示在展开列表中

SwiftUI:按名称分组数据并显示在展开列表中,swiftui,swiftui-list,Swiftui,Swiftui List,我尝试将从API获取的数据分组,并将其显示在一个扩展列表中,如 下面是一些示例数据 [ { "name": "Hair Cut", "createDate": 1600423060, "voucherID": 12311, "type": "service", "expiryDat

我尝试将从API获取的数据分组,并将其显示在一个扩展列表中,如 下面是一些示例数据

[
    {
        "name": "Hair Cut",
        "createDate": 1600423060,
        "voucherID": 12311,
        "type": "service",
        "expiryDate": 1600682257,
        "trxnID": 2683125
    },
    {
        "name": "Hair Cut",
        "createDate": 1600423060,
        "voucherID": 31231,
        "type": "service",
        "expiryDate": 1600682257,
        "trxnID": 2683124
    },
    {
        "name": "Package B",
        "createDate": 1596217117,
        "voucherID": 12312,
        "type": "service",
        "expiryDate": 0,
        "trxnID": 2423309
    }
]

现在我已经使用dictionary
dictionary(分组:self.dictions,by:{$0.name!})
将数据分组到
@Published var gVouchers=dictionary()
中。现在的问题是如何在展开列表中显示它们。扩展列表使用了字典中没有的子项。那么有什么方法可以做到这一点呢?或者我无法使用字典进行分组?

我已经按照教程(YouTube链接)进行了操作,您可以尝试下面的代码吗?(因为我没有升级Xcode,所以无法检查代码)。在下面的代码中,我只是解析本地存储的JSON文件和您的数据

struct ListItem: Decodable, Identifiable {
    let id = UUID()
    var name: String
    var createDate: TimeInterval?
    var voucherID: Int?
    var type: String?
    var expiryDate: TimeInterval?
    var trxnID: Int?
    var items: [ListItem]?
    
    init(name: String, items: [ListItem]) {
        self.name = name
        self.items = items
    }
}

struct ContentView: View {
    @State private var items: [ListItem] = []
    
    var body: some View {
        List(items, children: \.items) { item in
            Text(item.name)
        }.onAppear {
            self.parseJSON()
        }
    }
    
    func parseJSON() {
        guard let filePath = Bundle.main.url(forResource: "demo", withExtension: "json") else {
            items = []
            return
        }
        
        do {
            let data = try Data(contentsOf: filePath)
            let results = try JSONDecoder().decode([ListItem].self, from: data)
            let dict = Dictionary(grouping: results, by: { $0.name })
            self.items = dict.map { (key, value) -> ListItem in
                ListItem(name: key, items: value)
            }
        } catch {
            print(error)
        }
    }
}

我已经阅读了教程(YouTube链接),你能试试下面的代码吗?(因为我没有升级Xcode,所以我无法检查)。在下面的代码中,我只是解析本地存储的JSON文件和您的数据

struct ListItem: Decodable, Identifiable {
    let id = UUID()
    var name: String
    var createDate: TimeInterval?
    var voucherID: Int?
    var type: String?
    var expiryDate: TimeInterval?
    var trxnID: Int?
    var items: [ListItem]?
    
    init(name: String, items: [ListItem]) {
        self.name = name
        self.items = items
    }
}

struct ContentView: View {
    @State private var items: [ListItem] = []
    
    var body: some View {
        List(items, children: \.items) { item in
            Text(item.name)
        }.onAppear {
            self.parseJSON()
        }
    }
    
    func parseJSON() {
        guard let filePath = Bundle.main.url(forResource: "demo", withExtension: "json") else {
            items = []
            return
        }
        
        do {
            let data = try Data(contentsOf: filePath)
            let results = try JSONDecoder().decode([ListItem].self, from: data)
            let dict = Dictionary(grouping: results, by: { $0.name })
            self.items = dict.map { (key, value) -> ListItem in
                ListItem(name: key, items: value)
            }
        } catch {
            print(error)
        }
    }
}

这是否回答了您的问题:?@Asperi for value of my dictionary将是一个数组。所以我不知道该怎么办。我尝试了
List(Array(dictionals.gVouchers.keys),id:\.self){key in Text(key)
它可以显示键,但不能显示值。这是否回答了您的问题:?@Asperi对于我字典的值将是一个数组。所以我不知道如何做。我尝试了
List(Array(dictionals.gVouchers.keys),id:\.self){key in Text(key)
它可以显示键,但不能显示值。