Firebase Firestore Codable 为零
Firebase Firestore Codable is nil
我有这个模型,我想从 Firebase Firestore 中获取结果。
struct Notification: Identifiable, Codable {
var id = UUID()
var type: String
var createdAt: Date
enum CodingKeys: String, CodingKey {
case id
case type
case createdAt //Firestore Timestamp
}
}
视图模型
self.notifications = snapshot.documents.compactMap { queryDocumentSnapshot -> Notification? in
print(try? queryDocumentSnapshot.data(as: Notification.self)) //nil
return try? queryDocumentSnapshot.data(as: Notification.self)
}
问题是当我尝试填充数组时模型为零。
我在没有 createdAt
(时间戳)的情况下也尝试过,但仍然失败。
这里有什么问题吗?
您的 Notification 对象的 createdAt
属性 是日期,Firestore 中存储的是时间戳
struct Notification: Identifiable, Codable {
var id = UUID()
var type: String
var createdAt: Date <- needs to be a Timestamp
您可以更改 属性 以匹配,或将 Firestore 时间戳转换为日期
let aDate = timestamp.dateValue()
如果你想使用日期 属性 你可以在结构中包含一个初始化来处理那个
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.type = try values.decode(String.self, forKey: .type)
let ts = try values.decode(TimeStamp.self, forKey: .createdAt)
self.myDate = ts.dateValue()
我有这个模型,我想从 Firebase Firestore 中获取结果。
struct Notification: Identifiable, Codable {
var id = UUID()
var type: String
var createdAt: Date
enum CodingKeys: String, CodingKey {
case id
case type
case createdAt //Firestore Timestamp
}
}
视图模型
self.notifications = snapshot.documents.compactMap { queryDocumentSnapshot -> Notification? in
print(try? queryDocumentSnapshot.data(as: Notification.self)) //nil
return try? queryDocumentSnapshot.data(as: Notification.self)
}
问题是当我尝试填充数组时模型为零。
我在没有 createdAt
(时间戳)的情况下也尝试过,但仍然失败。
这里有什么问题吗?
您的 Notification 对象的 createdAt
属性 是日期,Firestore 中存储的是时间戳
struct Notification: Identifiable, Codable {
var id = UUID()
var type: String
var createdAt: Date <- needs to be a Timestamp
您可以更改 属性 以匹配,或将 Firestore 时间戳转换为日期
let aDate = timestamp.dateValue()
如果你想使用日期 属性 你可以在结构中包含一个初始化来处理那个
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.type = try values.decode(String.self, forKey: .type)
let ts = try values.decode(TimeStamp.self, forKey: .createdAt)
self.myDate = ts.dateValue()