我正在创建一个Firebase查询,该查询返回一组要转换为地图的数据。然后,我尝试访问键“ postScore”上的值,但收到错误“无法为索引类型为“ String”的类型为[String]的下标”。我也尝试使用“ value(forKeyPath :)”无济于事。
func getAccountScore(){
let postsRef = db.collection("posts")
let query = postsRef.whereField("UID", isEqualTo: Auth.auth().currentUser?.uid)
query.getDocuments(){ (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err)")
} else {
self.numberOfPosts = querySnapshot!.count
print("number of posts: \(self.numberOfPosts)")
for document in querySnapshot!.documents {
let dataDescription = document.data().map(String.init(describing:)).sorted(by: >)
print(dataDescription["postScore"])
}
}
}
}
答案 0 :(得分:3)
document.data()
返回类型是documentation的可选Dictionary
,因此您应按以下方式获取postScore
,
let postScore = document.data()?["postScore"]
print(postScore)
当前,您尝试将Array
中的String
(使用.map{}
创建的字典)作为字典来获取postScore
的值,但编译器不允许将Array
用作Dictionary
。
答案 1 :(得分:1)
不清楚您将要使用dataDescription做什么,但是乍一看似乎您只是在尝试从每个帖子中获取postScore。
@Kamran的回答很棒,但是这是另一种替代Firestore的方式。您可以使用.get
访问文档中的任何子字段。
for doc in snapshot!.documents {
let key = doc.documentID
let postScore = doc.get("postScore") as? String ?? "No Score"
print(key, postScore)
}
请注意,我添加了一些nil合并,以防缺少postScore文档而使应用程序不会崩溃或具有nil var。