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 就可以使用默认值进行解码。
我在使用 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 就可以使用默认值进行解码。