Пожарная карта снимка с несколькими типами объектов - PullRequest
0 голосов
/ 30 июня 2018

Я следовал этому учебнику для выполнения запросов из 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()
            }
        }
    }
}

Спасибо!

1 Ответ

0 голосов
/ 04 июля 2018

Нет необходимости в .compactMap ... это должно быть довольно просто, если вы просто создаете экземпляр "Note" или "Task" в зависимости от ключей document.data.

Я предполагаю, что свойство type в "Note" скажет вам, является ли объект запиской или задачей, верно? Если это так, вы можете сделать что-то вроде этого

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()
            }
        }
    }
}

Если «type» не сообщает вам, является ли элемент запиской или задачей, вы можете проверить словарь на наличие уникальной клавиши «Note» или «Task».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...