使用 Swift Codable 解码 firestore 文档时获取文档 ID

Getting document ID when decoding firestore document using Swift Codable

我正在使用 class 解码检索到的 firestore 文档,如果我不想操纵数据,它会按预期工作:

class Room: Identifiable, Codable {

    @DocumentID public var id:String?
    var name:String

}

但是,如果我尝试使用自己的 init 来设置值,我无法获取 firestore 文档 ID?

class Room: Identifiable, Codable {

    @DocumentID public var id:String?
    var name:String
    
    
    enum Keys:String, CodingKey {
        case name
        case capacity
        case photo = "url"
    }
    
    required init(from decoder: Decoder) throws {

        // How do I get the document ID to set the id value?

        let container = try decoder.container(keyedBy: Keys.self)
        name = try container.decode(String.self, forKey: .name)
        capacity = try container.decode(Int.self, forKey: .capacity)
        photo = try container.decode(String.self, forKey: .photo)

        // Do some more stuff here...
    }
}

在其他地方找到了答案,这很有效。发帖给任何来到这里并有相同查询的人。

TL;DR -

使用以下代码解码 init 函数中的 DocumentReference:

ref = try container.decode(DocumentID<DocumentReference>.self, forKey: .ref)
  .wrappedValue

更长的解释: 我不会假装 100% 理解这个,但这里有一个很好的解释 https://github.com/firebase/firebase-ios-sdk/issues/7242