映射数组以符合 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.
方法如下:
- 将
FirebaseFirestoreSwift
添加到您的项目。您可以使用 CocoaPods 或 Swift 包管理器来执行此操作。
- 导入
FirebaseFirestoreSwift
- 使您的类型符合
Codable
- 将
id
属性 添加到您的类型,并使用 @DocumentID
告诉 Firestore 将其映射到文档 ID
- 使用
documentReference.data(as: )
将文档引用映射到 Swift 类型
- 使用
documentReference.setData(from: )
将数据从 Swift 类型映射到 Firestore 文档
- (可选,但强烈推荐)实施正确的错误处理
有关详细信息,请查看 Mapping Firestore Data in Swift - The Comprehensive Guide
我从 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.
方法如下:
- 将
FirebaseFirestoreSwift
添加到您的项目。您可以使用 CocoaPods 或 Swift 包管理器来执行此操作。 - 导入
FirebaseFirestoreSwift
- 使您的类型符合
Codable
- 将
id
属性 添加到您的类型,并使用@DocumentID
告诉 Firestore 将其映射到文档 ID - 使用
documentReference.data(as: )
将文档引用映射到 Swift 类型 - 使用
documentReference.setData(from: )
将数据从 Swift 类型映射到 Firestore 文档 - (可选,但强烈推荐)实施正确的错误处理
有关详细信息,请查看 Mapping Firestore Data in Swift - The Comprehensive Guide