首页 > 解决方案 > 如何在 Swift 中从 Firebase Firestore 获取字典

问题描述

我想知道如何从我的 Firestore 中获取字典。对于普通数组,我已经这样做了:

func returnArray(){
    
    let newpath = Firestore.firestore().collection(path)
    
    newpath.addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
            
            return
        }
        
        self.Array = documents.map { (queryDocumentSnapshot) -> String in
            
            let data = queryDocumentSnapshot.data()
            
            let Name = data["myField"] as? String ?? ""

            return Name
            
        }
        
    }

    
}

这工作得很好。我现在的问题是如何更改从 Firebase 中获取 Array 的代码。我有一个想法,但它不起作用:

func returnDictionary(){
    
    let newpath = Firestore.firestore().collection(path)
    
    newpath.addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
            
            return
        }
        
        self.Dictionary = documents.map { (queryDocumentSnapshot) ->  // I don't know what to fill here
            in
            
            let data = queryDocumentSnapshot.data()
            
            let Name = data["AnzeigeName"] as? String ?? ""
            let ID = data["selfID"] as? String ?? ""

            return ID: Name
            
        }
        
    }

    
}

接下来我可以尝试什么?

标签: swiftfirebasegoogle-cloud-firestore

解决方案


.map会给你一个数组,但你可以使用 Dictionary'sinit(uniqueKeysWithValues:)把它变成一个Dictionary

let dictionary : Dictionary<String,String> = .init(uniqueKeysWithValues: documents.compactMap { queryDocumentSnapshot -> (String,String)? in
  let data = queryDocumentSnapshot.data()
  if let name = data["AnzeigeName"] as? String, let id = data["selfID"] as? String {
    return (id, name)
  }
  return nil
})

重要的是要知道,uniqueKeysWithValues如果键实际上不是唯一的,则会崩溃,因此您需要先检查一下(查看@New Dev 的关于init(_:uniquingKeysWith:)处理此问题的评论)。我也compactMap用来摆脱nil价值观。

(注意:在 Swift 中,通常变量名是小写的,类型名是大写的。违背这种模式可能会使您的代码难以被他人阅读)


推荐阅读