映射数组以符合 MVVM 结构中的模型 Swift

Map array to be conform with a Model in MVVM structure Swift

我从 Firebase 获取数据,在这个数据中我有一个字典数组。

我需要在 days 中设置这个字典数组符合 StickModel 因为 HabitModel 中的关键天需要符合 [ StickModel].

但是我得到这个错误:

我使用MVVM结构。

import Foundation
import Firebase

class HabitsViewModel: ObservableObject {
    @Published var habites = [HabitModel]()
    @Published var days = [StickModel]()
    
    private var db = Firestore.firestore()
    
    func fetchData() {
        debugPrint("Fetch Data...")
        db.collection("users/" + (Auth.auth().currentUser?.uid)! + "/Habits").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                debugPrint("No document")
                return
            }
            
            self.habites = documents.map { queryDocumentSnapshot -> HabitModel in
                let data = queryDocumentSnapshot.data()
                let id = queryDocumentSnapshot.documentID
                let title = data["title"] as? String ?? ""
                let progress = data["progress"] as? Float ?? 0
                let start = data["start"] as? String ?? ""
                let end = data["end"] as? String ?? ""
                
                                
                self.days = data["days"].map { myday -> StickModel in
                    
                    let completed = myday["completed"] as? Bool ?? false
                    let dayLetter = myday["day"] as? String ?? ""
                    let progress = myday["progress"] as? Float ?? 0
                    
                    return StickModel(id: UUID().uuidString, progress: progress, completed: completed, day: dayLetter)
                }
                
                
                return HabitModel(id: id, title: title, progress: progress, start: start, end: end, days: self.days)
            }
        }
    }
}

试试这个:

self.days = (data["days"] as? [[String: Any]] ?? []).map -> StickModel in

Firstore 支持 Codable,用于映射 Firestore 文档 from/to Swift,这消除了手动映射各个字段的需要,并且使整个过程更容易编写并且更少 error-prone.

方法如下:

  1. FirebaseFirestoreSwift 添加到您的项目。您可以使用 CocoaPods 或 Swift 包管理器来执行此操作。
  2. 导入FirebaseFirestoreSwift
  3. 使您的类型符合 Codable
  4. id 属性 添加到您的类型,并使用 @DocumentID 告诉 Firestore 将其映射到文档 ID
  5. 使用 documentReference.data(as: ) 将文档引用映射到 Swift 类型
  6. 使用 documentReference.setData(from: ) 将数据从 Swift 类型映射到 Firestore 文档
  7. (可选,但强烈推荐)实施正确的错误处理

有关详细信息,请查看 Mapping Firestore Data in Swift - The Comprehensive Guide