Как декодировать идентификатор документа Firestore для класса, который одновременно является Codable и ObservableObject - PullRequest
0 голосов
/ 14 июля 2020

У меня есть класс, который сводится примерно к следующему:

class GalleryPost: Codable, ObservableObject {
    @DocumentID public var id: String
    @Published public var myAttribute: String

    public init(_ myAttribute: String) {
        self.myAttribute = myAttribute
    }

    enum CodingKeys: CodingKey {
        case myAttribute
    }

    public func encode(to encoder: Encoder) throws {
        var container: KeyedEncodingContainer<GalleryPost.CodingKeys> = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(myAttribute, forKey: .myAttribute)
    }

    public required init(from decoder: Decoder) throws {
        var container: KeyedDecodingContainer<GalleryPost.CodingKeys> = try decoder.container(keyedBy: CodingKeys.self)
        myAttribute = try container.decode(String.self, forKey: .myAttribute)
    }
}

Если класс просто Codable, мне не нужно вручную реализовывать CodingKeys, кодировщик и декодер, и могу использовать поддержку модуля FirebaseFirestoreSwift, которая предоставляет @DocumentID, чтобы сделать все это за меня, но здесь это не так из-за ObservableObject. Поскольку myAttribute помечено как @Published, мне нужно вручную привести мой класс в соответствие с Codable, но моя текущая настройка больше не обрабатывает идентификаторы документов для меня, и я попытался добавить регистр documentId / documentID / DocumentID, но это только добавляет новое поле в мои данные Firestore.

Однако я все еще использую sh, чтобы установить id в свой идентификатор документа Firestore через мой декодер. Как я могу это сделать? В настоящее время я использую менее элегантный метод, который устанавливает свойство id в другом месте:

var post: GalleryPost? = try? queryDocument.data(as: GalleryPost.self)
if var post = post {
    post.id = queryDocument.documentID
}
...