使用 SwiftUI 从 Cloud Firestore 中的集合 'profiles' 中获取数据。无法将类型“[String : Any]”的值分配给类型 'UserProfile'

Fetching data from collection 'profiles' in Cloud Firestore with SwiftUI. Cannot assign value of type '[String : Any]' to type '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,它使您能够执行从 Firebase 文档到 Swift 结构的 type-safe 映射。

以下是您需要执行的操作:

  1. FirebaseFirestoreSwift 添加到您的 Podfile
  2. 导入FirebaseFirestoreSwift
  3. 确保您的 UserProfile 结构实现 Codable
  4. 阅读文档时,可以调用return try? queryDocumentSnapshot.data(as: UserProfile.self)
  5. 写文档时调用try db.collection("profiles").addDocument(from: userProfile)

我在 Mapping Firestore Data in Swift - The Comprehensive Guide, and also recorded this video 中对此进行了详细介绍。