在 Swift 中添加了 属性 结构 - 使现有对象无效
Added property to struct which in Swift - invalidates existing objects
我是 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
语句中包含非可选属性,所有其他属性都应该简单地分配可选的强制转换值。
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
s 而不进行任何展开,并添加 as Any
以消除隐式强制转换的警告。
func toAnyObject() -> Any {
return [
"name": name,
"timestamp": timestamp,
"itemValue": itemValue,
"description": description as Any,
"userId": userId as Any
]
}
我是 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
语句中包含非可选属性,所有其他属性都应该简单地分配可选的强制转换值。
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
s 而不进行任何展开,并添加 as Any
以消除隐式强制转换的警告。
func toAnyObject() -> Any {
return [
"name": name,
"timestamp": timestamp,
"itemValue": itemValue,
"description": description as Any,
"userId": userId as Any
]
}