首页 > 解决方案 > 无需字段名称即可获取文档字段的所有值

问题描述

迅速我有以下数组:

var postalCode = [String]()

在 Firestore 中,我将来会有很多文档,每个文档中有很多字段,其中包括邮政编码。像这样的东西:

在此处输入图像描述

现在,无论字段名称如何,如何获取我的集合(集合称为 deliveryPostalCodes)中所有文档的值?因为将来我将不得不在这里添加许多字段,我可以估计我将创建多少个文档和字段以及它们的名称。因此,我只想获取在此示例中类似于的值并将其M8V存储在我的变量var postalCode = [String]()中。我有以下代码;但在这我必须说出应该是什么字段名(code1):

db.collection(DatabaseRef.deliveryPostalCodes).getDocuments { (snap, error) in
            if let error = error{
                debugPrint(error.localizedDescription)
                return
            }
            snap?.documents.forEach({ (doc) in
                 let code1 = doc[DatabaseRef.code1] as? String ?? ""
   })
}

如果不调用字段名称,我怎么能做到这一点?

标签: iosswiftvariablesgoogle-cloud-firestore

解决方案


您可以通过调用其DocumentSnapshot.data()方法来获取文档中的所有字段,该方法返回一个[String: Any]. 之后,您可以从地图中获取值(删除键),然后过滤结果数组以删除空值。

它看起来像这样:

snap?.documents.forEach({ (doc) in
  let data = doc.data()
  let nonEmptyValues = (Array(data.values) as! [String]).filter { !$0.isEmpty }
  ...
})

我总是发现在在线游乐场(例如http://online.swiftplayground.run/ )中测试这种类型的东西是最容易的。我对此答案的测试台:

import Foundation

let data:[String:Any] = ["key1": "value1", "key2": "42", "key3": "", "key4": "value4"]

print(data)
print(data.values)
print((Array(data.values) as! [String]).filter { !$0.isEmpty })

哪个打印:

[“key3”:“”,“key2”:“42”,“key1”:“value1”,“key4”:“value4”]

["", "42", "value1", "value4"]

["42", "value1", "value4"]


推荐阅读