Ios 获取文档字段的所有值,而不需要字段名

Ios 获取文档字段的所有值,而不需要字段名,ios,swift,variables,google-cloud-firestore,Ios,Swift,Variables,Google Cloud Firestore,在swift中,我有以下数组: var postalCode = [String]() 在Firestore中,我将来会有许多文档,每个文档中都有许多字段,其中包括postalCodes。大概是这样的: 现在,如何获取集合中所有文档的值(集合称为deliveryPostalCodes),而不考虑字段的名称?因为在将来,我必须在这里添加许多字段,我可以估计我将创建多少文档和字段,以及它们的名称。因此,我只想获取本例中类似于M8V的值,并将其存储在我的变量var postalCode=[Stri

在swift中,我有以下数组:

var postalCode = [String]()
在Firestore中,我将来会有许多文档,每个文档中都有许多字段,其中包括postalCodes。大概是这样的:

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


如何在不调用字段名的情况下执行此操作?

您可以通过调用its来获取文档中的所有字段,its返回一个
[String:Any]
。之后,您可以从映射中获取值(删除键),然后过滤生成的数组以删除空值

它看起来像这样:

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

我总是觉得在网上的操场上测试这类东西最容易,比如。我对这个答案的测试台:

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 })
其中打印:

[“键3:”“键2:”“42”,“键1:”“value1”,“键4:”“value4”]

[“”、“42”、“值1”、“值4”]

[“42”、“价值1”、“价值4”]


我得到了这个错误:
类型为“Any”的值没有成员“isEmpty”
你知道为什么吗?另外,当我尝试附加到数组
postalCode.append(nonEmptyValues)
时,它给了我这个错误:
无法将类型为“[Any]”的值转换为预期的参数类型“String”
很好,我忘了将值转换为
[String]
。我用正确的代码更新了我的答案,并在中进行了测试,这样就可以解决第一个错误。但是,当我试图追加
postalCode.append(nonEmptyValues)
时,仍然会出现此错误
无法将“[String]”类型的值转换为预期的参数类型“String”
行保持不变,但在这种情况下,您的文档来自
onSuccessListener
。请参见此处的示例:
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 })