Разобрать массив объектов из словаря - PullRequest
0 голосов
/ 12 сентября 2018

Я загружаю документ из базы данных Firestore.Документ представляет собой Post и содержит массив Comment s.Комментарии находятся в массиве, который хранится в словаре с помощью клавиши "comments".Вот мои упрощенные модели.

class Post: NSObject {

    var id: String?
    var text: String?
    var comments = [Comment]()

    init(dictionary: [String: Any]) {
        self.id = dictionary["id"] as? String
        self.text = dictionary["text"] as? String ?? ""
        self.comments = dictionary["comments"] as? [Comment] ?? [Comment]()
    }

}

class Comment: NSObject {

    var id: String?
    var text: String?

    init(dictionary: [String: Any]) {
        self.id = dictionary["id"] as? String
        self.text = dictionary["text"] as? String ?? ""
    }

}

И вот как я загружаю эти данные из Firestore.

ref.getDocuments() { (querySnapshot, err) in
     if let err = err {
        print("Error getting documents: \(err)")
    } else {
        for document in querySnapshot!.documents {
            let dictionaryData = document.data()
            let newPost = Post(dictionary: dictionaryData)
            newPost.id = document.documentID
            self.posts.append(newPost)
            let index = IndexPath(row: 0, section: self.posts.count - 1)
            indexPathsToUpdate.append(index)
        } 
    }
}

По какой-то причине массив newPost.comments всегда пуст после инициализации.Где проблема?

1 Ответ

0 голосов
/ 13 сентября 2018

Если я правильно выполнил настройку, то в инициализаторе Post необходимо заменить

self.comments = dictionary["comments"] as? [Comment] ?? [Comment]()

С этим кодом:

let commentsDataArray = dictionary["comments"] as? [[String: Any]]
let parsedComments = commentsDataArray?.compactMap {
    return Comment(dictionary: $0) 
}
self.comments = parsedComments ?? [Comment]()

Это должно позволить вам создать новый объект из каждого элемента массива.

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