ios 字典上的ForEach

5lhxktic  于 2022-11-19  发布在  iOS
关注(0)|答案(1)|浏览(134)

我需要我的应用程序来显示一个数据表。数据看起来像["body": Optional("Go Shopping"), "isDeleted": Optional(false), "_id": Optional("63333b1600ce507b0097e3b3"), "isCompleted": Optional(false)]。表的列标题将是键body, isDeleted, isCompleted, _id。我将有此数据的多个示例,这些示例将具有相同的键,但不同的值。我将需要在各自的标题下显示每个数据示例的值,每行将属于一个数据示例。
示例:

我很挣扎,因为我能想到的唯一方法是使用字典,但在视图中使用字典时遇到了很多问题。

***重要说明:应用程序允许用户选择某个集合,然后应用程序将加载该集合的所有数据。每个集合的数据中有不同的键,所以我不能创建一个特定的结构体,因为我实际上不知道数据中的键/值。值类型将在每个集合中使用,并且在选择不同的集合时需要重绘表。
我的尝试

一个文档类,它将保存"value:[String:Any?]`字符串是键,Any是数据示例中的值

class Document{
    let value: [String:Any?]
    
    init(value:[String:Any?]) {
        self.value = value
    }
}

在ViewModel中,我调用了一个数据库,该数据库使用选定的集合名称返回该集合中所有文档的数组。

class DocumentsViewModel : ObservableObject {
    @Published var docKeys: [String]?
    @Published var docsList: [Document]?

    func getDocs() {
       ... //Database call to get docs from collection

            for doc in docs {
                // add doc keys to array (used for table header)
                self.docKeys = doc.value.keys.map{$0}
                
                self.docsList?.append(Document(value: doc.value))
    }

然后,在我的视图中,我尝试首先显示docKeys中的标题,然后使用该键遍历[Document]数组,访问值var,并使用该键获取要在该文档标题下显示的正确值

var body: some View {
        Text(viewModel.collectionName)
        
        HStack {
            ForEach(viewModel.docKeys ?? [], id: \.description) {key in
                Text(key.name)
                VStack {
                    ForEach(viewModel.docsList ?? [], id: \.value) { doc in
                        Text(doc.value[property.name])
                    }
                }
            }
        }
    }

在做了研究之后,我明白了为什么我不能在一个未排序的字典上使用ForEach。
我将接受任何关于如何显示此表的帮助/指导。另外,除了使用词典外,是否还有其他建议?谢谢!
更新
我可以让它在有序集合中工作

class Document : Hashable, Equatable{
    static func == (lhs: Document, rhs: Document) -> Bool {
        lhs.id.description == rhs.id.description
    }
    
    let id: String
    let value: OrderedDictionary<String,Any?>
    
    init(id: String, value: OrderedDictionary<String,Any?>) {
        self.id = id
        self.value = value
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

由于它是有序的,因此允许我在视图中迭代字典

noj0wjuj

noj0wjuj1#

只是几个提示:

  • 如果需要“带顺序的字典”,可以尝试使用Key-ValuePairs对象,该对象本质上是一个标签为keyvalue的元组数组

let values: KeyValuePairs = ["key1": "value1", "key2": "value2"]当你把它输出到控制台时,你会意识到这只是一个元组!print(values[0])将显示(key: "key1", value: "value1")

struct Document {
  let body: String?
  let isDeleted: Bool?
  let id: String?
  let isCompleted: Bool?
...
}

相关问题