如何解决使用SwiftUI从Cloud Firestore中的集合“配置文件”中获取数据无法将类型“ [String:任何]”的值分配为类型“ 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'
谢谢。
解决方法
您的用户使用UserProfile结构,但是当您将该文档数据分配给该用户变量时,该文档数据不是以UserProfile的形式出现,而是以[String:Any]的形式出现。
您所要做的就是将[String:Any]转换为UserProfile:
替换
self.user = data
使用
self.user = UserProfile(uid: document.get("uid") as? String ?? "",firstName: document.get("first name") as? String ?? "",email: document.get("email") as? String ?? "",gender: document.get("gender") as? String ?? "")
,
Firebase支持Codable API,该API使您能够执行从Firebase文档到Swift结构的类型安全的映射。
这是您需要执行的操作:
- 将
FirebaseFirestoreSwift
添加到您的Podfile
- 导入
FirebaseFirestoreSwift
- 确保您的
UserProfile
结构实现Codable
- 阅读文档时,您可以致电
return try? queryDocumentSnapshot.data(as: UserProfile.self)
- 编写文档时,请致电
try db.collection("profiles").addDocument(from: userProfile)
我已经在this article和this video中撰写并详细讨论了这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。