我從 Firebase 獲取資料,在這個資料中我有一個字典陣列。
我需要將這個字典陣列設定為符合 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)
}
}
}
}
uj5u.com熱心網友回復:
嘗試這個:
self.days = (data["days"] as? [[String: Any]] ?? []).map -> StickModel in
uj5u.com熱心網友回復:
Firstore 支持 Codable,用于將 Firestore 檔案從/到 Swift 映射,這消除了手動映射單個欄位的需要,并使整個程序更容易撰寫并且不易出錯。
方法如下:
- 添加
FirebaseFirestoreSwift到您的專案中。您可以使用 CocoaPods 或 Swift 包管理器來執行此操作。 - 進口
FirebaseFirestoreSwift - 使您的型別符合
Codable - 向您的型別添加一個
id屬性,并用于@DocumentID告訴 Firestore 將其映射到檔案 ID - 用于
documentReference.data(as: )將檔案參考映射到 Swift 型別 - 用于
documentReference.setData(from: )將資料從 Swift 型別映射到 Firestore 檔案 - (可選,但強烈推薦)實施正確的錯誤處理
有關更多詳細資訊,請查看在 Swift 中映射 Firestore 資料 - 綜合指南
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449592.html
