我遵循此tutorial来从Firebase Firestore执行查询
只要我只有一种类型的对象注意,一切都很好。 这是我的对象结构:
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Note {
var title:String
var date:Date
var text:String
var type:String
var dictionary:[String:Any] {
return [
"title":title,
"date":date,
"text":text,
"type":type,
]
}
}
extension Note : DocumentSerializable {
init?(dictionary: [String : Any]) {
guard let title = dictionary["title"] as? String,
let date = dictionary["date"] as? Date,
let text = dictionary["text"] as? String,
let type = dictionary["type"] as? String else {return nil}
self.init(title: title, date: date, text: text, type: type)
}
我创建了另一个具有相同协议和不同属性的结构任务,但是我不知道如何将其与其他结构映射在一起,以便在同一数组中具有注意和任务
var db:Firestore!
var itemsArray = [Note]() //How can I add the tasks too?
func loadData() {
db.collection("items").order(by: "date", descending: true).getDocuments() {
querySnapshot, error in
if let error = error {
print("\(error.localizedDescription)")
} else {
//HERE!
self.itemsArray = querySnapshot!.documents.compactMap({Note(dictionary: $0.data())})
DispatchQueue.main.async {
self.collectionView.reloadData()
}
}
}
}
谢谢!
答案 0 :(得分:0)
不需要.compactMap ...如果仅根据document.data键创建和创建“ Note”或“ Task”的实例,这应该非常简单。
我猜测“注释”中的type属性会告诉您对象是注释还是任务,对吗?如果是这样,您可以做这样的事情
var itemsArray = [Any?]()
func loadData() {
db.collection("items").order(by: "date", descending: true).getDocuments() {
querySnapshot, error in
if let error = error {
print("\(error.localizedDescription)")
} else {
guard let documents = querySnapshot.documents else {return}
for document in documents {
let dictionary = document.data() as [String : Any]
if dictionary["type"] == "note" {
let note = Note(dictionary: dictionary)
self.itemsArray.append(note)
} else if dictionary["type"] == "task" {
let task = Task(dictionary: dictionary)
self.itemsArray.append(task)
}
self.collectionView.reloadData()
}
}
}
}
如果“类型”没有告诉您该项目是注释还是任务,则可以在字典中查看唯一的“注释”或“任务”键。