Использование Decodable для получения идентификатора объекта и документа с помощью Firestore - PullRequest
0 голосов
/ 16 ноября 2018

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

{ 
  "localIdentifier": "xyc9870",
  "isOnline": false,
  "username": "ZS"
}

Я хочу использовать Decodable Swift, чтобы легко превратить QueryDocumentSnapshot в безопасную структуру Swift типа. Я также хочу убедиться, что я получаю documentID из QueryDocumentSnapshot для обновления объекта позже.

Это то, что я сейчас использую для декодирования, но, очевидно, он пропускает documentId

struct User: Decodable {

    let localIdentifier: String
    let username: String
    let isOnline: Bool

}

Хотел бы здесь руку. Спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Я написал себе небольшое удобное расширение, которое просто добавляет documentID в data JSON, а затем я могу использовать простое struct ниже

extension QueryDocumentSnapshot {

    func prepareForDecoding() -> [String: Any] {
        var data = self.data()
        data["documentId"] = self.documentID

        return data
    }

}

Декодирование с использованием:

struct User: Decodable {

    let documentId: String
    let localIdentifier: String
    let username: String
    let isOnline: Bool

}

if let user = try? JSONDecoder().decode(User.self, fromJSONObject: doc.prepareForDecoding()) {
    ...
}

Редактировать:

My JSONDecoder extension

extension JSONDecoder {
    func decode<T>(_ type: T.Type, fromJSONObject object: Any) throws -> T where T: Decodable {
        return try decode(T.self, from: try JSONSerialization.data(withJSONObject: object, options: []))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...