首页 > 解决方案 > 使用 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'

提前致谢。

标签: firebasetypesgoogle-cloud-firestoreswiftuidocument

解决方案


Firebase 支持 Codable API,它使您能够执行从 Firebase 文档到 Swift 结构的类型安全映射。

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

  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中详细介绍了这一点,还录制了这个视频


推荐阅读