【问题标题】:How can I add these Firestore fields to a Dictionary?如何将这些 Firestore 字段添加到字典?
【发布时间】:2020-10-04 09:02:23
【问题描述】:

我希望将我所有的“用户名”添加到字典中。我在这样做时遇到了一些麻烦。我确信这很明显,但我对编码很陌生。

我现在陷入困境,似乎无法在任何地方找到明确的答案:

func fetchUser() {
        let db = Firestore.firestore()
        let usernameSearch = db.collection("users")
        usernameSearch.getDocuments { (snapshot, error) in
            if error != nil {
                print("Error obtaining usernames")
            } else {
                for field in snapshot!.documents {
                   let field = field.get("username")
                    print(field!)
                }

            }

        }


}

如果有人可以帮助我,我将不胜感激。我确信这很明显,或者我完全错了。

【问题讨论】:

  • 是不是类似于for document in snapshot!.documents { document.data()["field"] ...

标签: swift google-cloud-firestore swift5


【解决方案1】:

首先,养成安全展开而不是强制展开的习惯。并为您的对象选择更准确的名称(即usersCollection 而不是usernameSearch)。但是,在这种情况下,无需实例化数据库和集合的各个属性,因为它们不会在其他任何地方使用,而是在这里(所以要高效并省略它们)。

var usersDictionary = [String: [String]]()

func fetchUser() {
    Firestore.firestore().collection("users").getDocuments { (snapshot, error) in
        if let snapshot = snapshot { // unwrap the snapshot safely
            var usernames = [String]()
            for doc in snapshot.documents {
                if let username = doc.get("username") as? String {
                    usernames.append(username)
                }
            }
            usersDictionary["usernames"] = usernames
        } else {
            if let error = error {
                print(error)
            }
        }
    }
}

或者,如果您实际上是指一组用户:

var usersArray = [String]()

func fetchUser() {
    Firestore.firestore().collection("users").getDocuments { (snapshot, error) in
        if let snapshot = snapshot { // don't force unwrap with !
            for doc in snapshot.documents {
                if let username = doc.get("username") as? String {
                    usersArray.append(username)
                }
            }
        } else {
            if let error = error {
                print(error)
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我假设您要查找的是 Array,而不是 Dictionary。我还将假设您确实从field.get("username") 中获得了您期望的正确值,例如一个字符串,例如“Bob”。因此,您要做的是将文档对象列表映射到字符串列表。

    如果您滚动到 Apple 的 Array 文档的 Topics 部分,您可以找到它们为数组提供的一些操作,例如 snapshot!.documents

    其中一个操作实际上是map,它的描述是:

    返回一个数组,其中包含将给定闭包映射到序列元素的结果。

    https://developer.apple.com/documentation/swift/array/3017522-map

    换句话说,您为属于snapshot!.documents Array 的文档的每个实例提供一个转换 并返回一个新的Array 包含该转换的结果值。

    在这种情况下,我将使用更具体的操作; compactMap。我们必须尝试将返​​回的值从 Any 转换为 String。如果不成功,它将返回 nil,我们将要过滤掉它。由于 Firebase 控制台的类型要求,我认为这种情况不太可能发生,但最好能意识到这一点。示例如下:

    func fetchUsernames(from usernameCollection: String, completion: @escaping ([String]) -> Void) {
        let db = Firestore.firestore()
        let collection = db.collection(usernameCollection)
    
        collection.getDocuments { snapshot, error in
            guard error != nil,
                  let usernames = snapshot?.documents.compactMap { $0.get("username") as? String }
            else { return print("Error obtaining usernames") }
    
            completion(usernames)
        }
    }
    

    这里的关键是let usernames = snapshot?.documents.map { $0.get("username") }。我们正在向 map 函数传递一个 closure。这个闭包本身传递了一个参数; snapshot?.documents 数组中的每个值。您可以使用$0 引用这个传入的值。

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2018-06-22
      • 2018-12-22
      • 2020-04-25
      • 1970-01-01
      • 2021-11-29
      • 2016-06-15
      • 1970-01-01
      相关资源
      最近更新 更多