使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”
Posted
技术标签:
【中文标题】使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”【英文标题】:Fetching data from collection 'profiles' in Cloud Firestore with SwiftUI. Cannot assign value of type '[String : Any]' to type 'UserProfile' 【发布时间】:2020-09-03 16:32:50 【问题描述】:我是开发新手,正在寻求帮助。
我已经成功创建了一组存储在 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'
提前致谢。
【问题讨论】:
【参考方案1】: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详细介绍了这个,还记录了this video。
【讨论】:
【参考方案2】:您的用户使用 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 ?? "")
【讨论】:
请不要手动映射数据。使用 Firestore 的 Codable 支持可以节省您的时间和麻烦。见我上面的回答。以上是关于使用 SwiftUI 从 Cloud Firestore 中的集合“配置文件”中获取数据。无法将类型“[String:Any]”的值分配给类型“UserProfile”的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Desc SwiftUI 对 Cloud Firestore 数据进行排序