我是 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
]
}