如何在Swift中给定键的情况下返回映射数据的值?

时间:2019-09-30 05:06:50

标签: swift firebase dictionary google-cloud-firestore

我正在创建一个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"])
                }
            }
        }
    }

2 个答案:

答案 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。