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

SwiftUI: Group data by name and display in expanded list

我尝试对从 API 获取的数据进行分组,并将其显示在扩展列表中,例如 How to create expanding lists – SwiftUI 这是一些示例数据。

[
    {
        "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(grouping: self.vouchers, by: {[=11=].name!}) 将数据分组到 @Published var gVouchers = Dictionary<String, Any>() 中。所以现在的问题是我如何在扩展列表中显示它们。扩展列表使用 children 我在字典中没有。那么有什么方法可以这样做吗?或者我不能用字典做分组?

我已经按照教程(YouTube link)学习了,你能试试下面的代码吗?(因为我还没有升级[=15,所以无法检查=])。在下面的代码中,我只是解析与您的数据一起存储在本地的 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: { [=10=].name })
            self.items = dict.map { (key, value) -> ListItem in
                ListItem(name: key, items: value)
            }
        } catch {
            print(error)
        }
    }
}