如何在 Swift 中从 Firestore 获取对象数组?

4
在Swift中,要从Firestore检索数组,我使用以下代码:
currentDocument.getDocument { (document, error) in
  if let document = document, document.exists {
    let people = document.data()!["people"]
    print(people!)
  } else {
    print("Document does not exist")
  }
}

我收到的数据看起来像这样


(
  {
    name = "Bob";
    age = 24;
  }
)

然而,如果我只想要获取名称,通常我会执行以下操作:print(document.data()!["people"][0]["name"])

但是我得到的响应是Value of type 'Any' has no subscripts

如何访问people数组中该对象内部的名称键?

2个回答

8
document.data()!["people"] 返回的值是类型为 Any 的,您无法在 Any 上访问 [0]
您需要先将结果转换为数组,然后再获取第一个项目。虽然我不是 Swift 专家,但应该是这样的:
let people = document.data()!["people"]! as [Any]
print(people[0])

这导致应用程序崩溃并给出了错误信息“无法将类型 '__NSArrayM' 的值转换为 'NSDictionary'”,你知道如何解决吗? - Richard Reis
是的,我想我不小心把它变成了一个字典。我更新了我的答案,但我也强烈建议搜索这些错误消息(因为这基本上就是我正在做的事情)。 - Frank van Puffelen
这个有效!谢谢。我确实查阅这些错误信息,但有时候不理解它们。例如,你的解决方案给了我 people[0] 的结果。但是当我尝试获取 people[0]["name"] 时,它告诉我 Cannot subscript a value of type '[Any]' with an index of type 'String' - Richard Reis
所以我试图将 [Any] 转换为 [Any : String],但是我得到了 Type 'Any' does not conform to protocol 'Hashable' 的错误信息... 这就是我卡住的地方... - Richard Reis
1
people[0] 是一个字典,其中每个键都是字符串,而值可以是任何类型(因为它既可以是字符串也可以是数字)。因此,将 people[0] 转换为 [String: Any] 就是正确的转换方式。 - Frank van Puffelen

4
更好的表达 @Frank van Puffelen 的回答应该是:
currentDocument.getDocument { document, error in
  guard error == nil, let document = document, document.exists, let people = document.get("people") as? [Any] else { return }
    print(people)
  }
}

第二行可能有点长,但它可以防止所有可能的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接