首页 > 解决方案 > Swift 中可解码的 DocumentReference

问题描述

我在 swift 中有一个自定义模型,它有一个类型的属性,DocumentReference 我从云函数中获取一些数据,然后我试图将它解码回我的模型。

DocumentReference本身不符合 Decodable ,所以我正在尝试为它编写一个扩展。

我无法使它工作,因为我不断收到此错误:

初始化器要求“init(from:)”只能由非最终类“DocumentReference”定义中的“必需”初始化器满足

知道如何进行这项工作吗?

我的扩展:

import Firebase

extension DocumentReference: Decodable {
    public convenience init(from decoder: Decoder) throws {
        //
    }
}

现有型号:

struct Notification: Identifiable, CollectionProtocol, DocumentProtocol {
    var id = UUID()

    var documentReference: DocumentReference
    var receiverID: String
    var type: String
    var createdAt: Date
    var requestReference: DocumentReference?
    var request: Request?

    init(document: DocumentSnapshot) {
        self.documentReference = document.reference
        self.requestReference = document["requestReference"] as? DocumentReference ?? Firestore.firestore().document("")
        self.receiverID = document["receiverID"] as? String ?? ""
        self.type = document["type"] as? String ?? ""
        self.createdAt = (document["createdAt"] as? Timestamp)?.dateValue() ?? Date()
    }
}

标签: iosswiftfirebasegoogle-cloud-firestoredecodable

解决方案


DocumentReference 类不是最终的,这意味着它可能是子类,但没有符合 Codable 的子类。init(from decoder: Decoder)因此,如果在您的扩展程序中被调用,这将处于未知状态。

一种解决方法可能是创建一个自己的包装结构,init(from decoder: Decoder)然后在那里对 DocumentReference 进行解码。

例子:

struct Wrapped: Decodable {
    let docRef: DocumentReference

    public init(from decoder: Decoder) throws {
        let container = try decoder....

        // add the decoding code here for DocumentReference
    }
}

推荐阅读