在 Swift 中向结构添加了属性 - 使现有对象失效



我是 Swift 的新手,但有一些 Objective-C 编程的基本经验,Swift 似乎简单得多。

但是,我不太明白struct的事情。我遵循了有关如何使用 Firebase 实时数据库的教程,本教程使用模型来存储数据。

但是,当我使用其他属性修改struct时,数据库中以前保存的条目没有显示。我认为这是因为模型无法识别数据库中的对象,因为它具有不同的属性,但是如何使属性可选?因此,数据库中具有不同结构(缺少属性(的旧条目仍然有效并显示出来?

这是模型。添加的新属性是对description的所有引用。

import Foundation
import Firebase
struct InsuranceItem {
let ref: DatabaseReference?
let key: String
let name: String
let timestamp: Int
let itemValue: Int
let description: String?
let userId: String?
init(name: String, timestamp: Int, itemValue: Int = 0, description: String = "", userId: String, key: String = "") {
self.ref = nil
self.key = key
self.name = name
self.timestamp = Int(Date().timeIntervalSince1970)
self.itemValue = itemValue
self.description = description
self.userId = userId
}
init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: AnyObject],
let name = value["name"] as? String,
let timestamp = value["timestamp"] as? Int,
let itemValue = value["itemValue"] as? Int,
let description = value["description"] as? String,
let userId = value["userId"] as? String else { return nil }
self.ref = snapshot.ref
self.key = snapshot.key
self.name = name
self.timestamp = timestamp
self.itemValue = itemValue
self.description = description
self.userId = userId
}
func toAnyObject() -> Any {
return [
"name": name,
"timestamp": timestamp,
"itemValue": itemValue,
"description": description!,
"userId": userId!
]
}
}

有问题的位是你的可失败初始化,init?(snapshot: DataSnapshot).即使缺少Optional属性,初始化也会失败,这是不正确的。您应该只在guard语句中包含非 Optional 属性,所有其他属性都应简单地分配可选强制转换值。

init?(snapshot: DataSnapshot) {
guard
let value = snapshot.value as? [String: Any],
let name = value["name"] as? String,
let timestamp = value["timestamp"] as? Int,
let itemValue = value["itemValue"] as? Int else { return nil }
self.ref = snapshot.ref
self.key = snapshot.key
self.name = name
self.timestamp = timestamp
self.itemValue = itemValue
// Optional properties
let description = value["description"] as? String
let userId = value["userId"] as? String
self.description = description
self.userId = userId
}

与您的问题无关,但您的toAnyObject函数不安全,因为您正在强制解开Optional值。只需将它们保留为Optional,无需任何展开包装,并添加as Any以消除隐式胁迫的警告。

func toAnyObject() -> Any {
return [
"name": name,
"timestamp": timestamp,
"itemValue": itemValue,
"description": description as Any,
"userId": userId as Any
]
}

最新更新