firebase - 使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”
问题描述
我是开发新手,寻求帮助。
我设法创建了存储在 Cloud Firestore 中的配置文件集合。我现在想检索已登录的用户个人资料信息以在我的整个应用程序中使用。
这是我到目前为止所拥有的:
import SwiftUI
import Firebase
class UserViewModel: ObservableObject {
@Published var user: UserProfile = UserProfile(uid: "", firstName: "", email: "", gender: "")
private var db = Firestore.firestore()
func fetchProfileFirstName () {
let userId = Auth.auth().currentUser?.uid ?? ""
db.collection("profiles").document(userId)
.addSnapshotListener { documentSnapshot, error in
guard let document = documentSnapshot else {
print("Error fetching document: \(error!)")
return
}
guard let data = document.data() else {
print("Document data was empty.")
return
}
print("Current data: \(data)")
self.user = data
}
}
}
我收到错误:'Cannot assign value of type '[String : Any]' to type 'UserProfile'
提前致谢。
解决方案
Firebase 支持 Codable API,它使您能够执行从 Firebase 文档到 Swift 结构的类型安全映射。
以下是您需要执行的操作:
- 添加
FirebaseFirestoreSwift
到您的Podfile
- 进口
FirebaseFirestoreSwift
- 确保你的
UserProfile
结构实现Codable
- 阅读文档时,可以调用
return try? queryDocumentSnapshot.data(as: UserProfile.self)
- 编写文件时,调用
try db.collection("profiles").addDocument(from: userProfile)
我在Mapping Firestore Data in Swift - The Comprehensive Guide中详细介绍了这一点,还录制了这个视频。
推荐阅读
- java - 获取列表中不在Java中另一个列表中的下一个项目
- swift - 视图在父视图中的行为与在预览中的行为不同
- arrays - Rust 向量的性能(`Vec
`) 与数组 (`[T; n]`) - rust - *mut (dyn std::ops::Fn() + 'static)` 不能使用 serde::de::DeserializeOwned 结构在线程之间安全共享
- python - 为什么列表的大小小于组成它的对象的大小?
- sorting - 谷歌表格拆分单词,然后按字母顺序排序,使用数组公式
- android - 如何根据我在 Android Studio 的 Firebase 数据库中更改的值使用可绘制文件夹更改 gif?
- c# - 仅向一级子级添加脚本
- python - 在 Pandas Dataframe 中查找相似的行并减去特定的列值
- arp - 无法响应 OVS 系统中的 ARP 请求