Swift 4 使用 CodableFirebase 和自定义处理来自 Firestore 的 nil 值 类

Swift 4 handling nil values from Firestore with CodableFirebase and custom classes

我在使用 Google 的 Firestore 时使用库 CodableFirebase 对数据进行解码和编码。它工作得很好,除非一个值没有在数据库中定义,而是 class 的 属性。我想知道您如何定义 class 以便当快照从 Firebase 返回时它不会吐出 nil 值。

这是一个简单的例子。这就是我的 class 定义。

class TimeThing: Codable {
 var requestedTime: Double?
 var createdTime: Double?

 init(
    requestedTime: Double? = 0,
    createdTime: Double? = 0
    ) {
     self.requestedTime = requestedTime
     self.createdTime = createdTime
}}

这就是抛出的错误。在这种情况下,createdTime 在 Firestore 中有一个值,而 'requestedTime' 没有。

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "requestedTime", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))

我意识到我遗漏了一些基本的东西,但不幸的是我不确定那是什么。我需要对我的 class 做些什么来设置默认值,以便在遇到来自 Firestore 的 nil 值时不会破坏我的 try 块?

谢谢!!

原来问题的核心是 class 中的默认值定义不正确。

class TimeThing: Codable {
 var requestedTime: Double?
 var createdTime: Double?

 init(
    requestedTime: Double? = 0,
    createdTime: Double? = 0
    ) {
     self.requestedTime = requestedTime
     self.createdTime = createdTime
}}

应该是

class TimeThing: Codable {
 var requestedTime: Double? = 0
 var createdTime: Double? = 0

 init(
    requestedTime: Double,
    createdTime: Double
    ) {
     self.requestedTime = requestedTime
     self.createdTime = createdTime
}}

一旦我解决了这个问题,CodableFirebase 就可以使用默认值进行解码。