使用Decodable在Firestore中获取对象和文档ID

时间:2018-11-16 15:45:01

标签: swift firebase google-cloud-firestore

我有一个简单的User类,其中包含以下字段:

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

我想使用Swift的Decodable轻松地将QueryDocumentSnapshot变成类型安全的Swift结构。我还想确保我从documentID获得了QueryDocumentSnapshot,以便以后更新对象。

这是我目前用于解码的内容,但是显然它错过了documentId

struct User: Decodable {

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

}

在这里愿意帮忙。谢谢!

1 个答案:

答案 0 :(得分:1)

我为自己编写了一个方便的扩展,将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()) {
    ...
}

编辑:

我的JSONDecoder扩展名

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: []))
    }
}