我需要我的应用程序来显示一个数据表。数据看起来像["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)
}
}
由于它是有序的,因此允许我在视图中迭代字典
1条答案
按热度按时间noj0wjuj1#
只是几个提示:
Key-ValuePairs
对象,该对象本质上是一个标签为key
和value
的元组数组let values: KeyValuePairs = ["key1": "value1", "key2": "value2"]
当你把它输出到控制台时,你会意识到这只是一个元组!print(values[0])
将显示(key: "key1", value: "value1")
The Swift Collections
https://www.kodeco.com/24803770-getting-started-with-the-swift-collections-package中查看OrderedDictionary