ios - 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()
}
}
解决方案
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
}
}
推荐阅读
- promise - 什么是处理非关键任务承诺拒绝的好方法
- javascript - Formik 表单中如何改变 Switch 的值?
- c++ - 为什么要调用复制构造函数?
- python - 使用python在当前日期或今天日期添加2天的错误输出
- r - 如何删除 R 中最常用单词的非英语单词?
- azure-web-app-service - 在 Blazor 服务器项目上提供没有文件扩展名的静态内容
- twitter-bootstrap - b 表中的 BootstrapVue 条件列
- cordova - Ionic 5 和 Capacitor 以 android 4.4 (API 19) 为目标
- javascript - Firebase 功能重新加载 auth currentUser,不会在 vue 组件中刷新
- ios - 如果已经可见,视图控制器不显示