swift - 如何在 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
}
}
}
接下来我可以尝试什么?
解决方案
.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 中,通常变量名是小写的,类型名是大写的。违背这种模式可能会使您的代码难以被他人阅读)
推荐阅读
- kubernetes - JupyterHub generic.oauthenticator:500 内部服务器错误/cookie 中缺少 400 OAuth 状态
- sql - How to insert values in already created SQLite file in Android Studio?
- python - 为什么不以这种方式使用 for 循环替换列表中的每个项目?
- java - Jackson - 嵌套映射值的自定义反序列化器
- php - 如何使用 htaccess 和 php 避免错误变量
- c# - 图像 src 指向 WEB FORM 中我的项目文件夹之外的文件
- c# - 为什么在面向 .NET Standard 的项目中可以不分配 Out 参数?
- python - 在循环中动态命名保存的数据帧
- java - 设置/更改默认 Java MaxHeapSize 或更改默认 JVM 命令设置
- python - 使用python对数据进行均匀和奇数切片