我在为Firebase时间戳数据类型分配默认值时遇到了麻烦
这是我的模型:
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct MiniSite: Codable, Identifiable {
@DocumentID var id: String?
var name:String
var city: String
var country: String
var region: String? = ""
@ServerTimestamp var createDate: Timestamp?
}
我的Firebase数据是这样的:
name:"Clerigos Tower"
city :"Porto",
country:"Portrugal",
createDate: "March 3, 2021 at 4:19:53 PM UTC+2"(timestamp)
我读取Firebase数据的代码来自Peter Friese的视频"用SwiftUI和Firebase构建一个待办事项列表应用程序">
import Foundation
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift
class MSiteRepository: ObservableObject {
let db = Firestore.firestore()
@Published var sites = [MiniSite] ()
func loadData() {
db.collection("sites")
.addSnapshotListener { (querySnapshot, error) in
if let querySnapshot = querySnapshot {
self.sites = querySnapshot.documents.compactMap { document in
do {
let x = try document.data(as: MiniSite.self)
return x
}
catch {
print(error)
}
return nil
}
}
}
}
}
如果我的记录包含一个createDate,那么一切工作正常。但是createDate在我的数据库中是可选的,因此我在模型中相应地定义了它@ServerTimestamp var createDate: Timestamp?
如果Firebase中的文档不包含createDate字段,我在解码期间得到以下错误:
keyNotFound(CodingKeys(stringValue: "createDate", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "createDate", intValue: nil) ("createDate").", underlyingError: nil))
对于那些没有createDate字段的记录,createDate为nil是可以的。问题是这些记录没有被添加到我的站点数组。
我试过以下方法:
- 为createDate 添加默认值
@ServerTimestamp var createDate: Timestamp?=nil
- 添加CodingKeys enum
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct MiniSite: Codable, Identifiable {
@DocumentID var id: String?
var name:String
var city: String
var country: String
var region: String? = ""
@ServerTimestamp var createDate: Timestamp?
enum CodingKeys: String, CodingKey {
case name
case city
case country
case createDate
}
}
这些对结果都没有任何影响
我不需要更新数据库,所以我也试图从createDate字段中删除@ServerTimestamp。那也没用
正如@jnpdx在注释中提供的那样,解决方案是删除@ServerTimestamp注释并使用可选的Timestamp。
改变@ServerTimestamp var createDate: Timestamp?
var createDate: Timestamp?