我是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!
]
}
}
有问题的一点是你的initable失败。init?(snapshot: DataSnapshot)
. 即使有一个 Optional
属性缺失,这是不正确的。你应该只在你的 guard
语句,其他的都应该简单地用可选的值来分配。
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
]
}