使用 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 数据进行排序

BigQuery 与 Cloud SQL 自动扩缩?

如何使用 SwiftUI 中的 documentID 删除特定的 Cloud Firestore 文档?

SwiftUI设计从入门到精通教程

SwiftUI基础 - Image 图片

SwiftUI基础 - Image 图片