Ios 使用Swift初始化对象以在Firebase上获取可选值
一般来说,我对初始化对象很满意,但我的方法似乎只在数据库中必须存在所有参数时才起作用。我已经看了哪些有效。但我现在不知道如何用嵌套数组初始化它 这是我通常初始化对象的方式:Ios 使用Swift初始化对象以在Firebase上获取可选值,ios,swift,firebase,firebase-realtime-database,initializer,Ios,Swift,Firebase,Firebase Realtime Database,Initializer,一般来说,我对初始化对象很满意,但我的方法似乎只在数据库中必须存在所有参数时才起作用。我已经看了哪些有效。但我现在不知道如何用嵌套数组初始化它 这是我通常初始化对象的方式: class User { var firstName: String var lastName: String var summary: String? var groups = [Group]() var ref: DatabaseReference? var key: S
class User {
var firstName: String
var lastName: String
var summary: String?
var groups = [Group]()
var ref: DatabaseReference?
var key: String
init?(from snapshot: DataSnapshot) {
let snapshotValue = snapshot.value as? [String: Any]
guard let firstName = snapshotValue?["firstName"] as? String, let lastName = snapshotValue?["lastName"] as? String, let summary = snapshotValue?["summary"] as? String else { return nil }
self.firstName = firstName
self.lastName = lastName
self.summary = summary
self.key = snapshot.key
self.groups(snapshot: snapshot.childSnapshot(forPath: "groups"))
}
func groups(snapshot: DataSnapshot) {
for child in snapshot.children {
guard let group = child as? DataSnapshot else { continue }
}
}
只是不要让可选属性成为该保护的一部分(这就是阻止执行完成它的原因:
init?(from snapshot: DataSnapshot) {
let snapshotValue = snapshot.value as? [String: Any]
guard let firstName = snapshotValue?["firstName"] as? String,
let lastName = snapshotValue?["lastName"] as? String else { return nil }
self.firstName = firstName
self.summary = snapshotValue?["summary"] as? String
self.key = snapshot.key
self.groups(snapshot: snapshot.childSnapshot(forPath: "groups"))
}
或者,您可以使用if let
语法:
if let summary = snapshotValue?["summary"] as? String {
self.summary = summary
}
但在这种情况下,这更简单:
self.summary = snapshotValue?["summary"] as? String
还显示一个示例,说明您要使用什么来初始化它。这看起来应该有效,但实际上无效。假设我希望摘要是
可选的
。如果我尝试初始化它,它将不起作用,因为参数不存在。哦,我现在明白了,给我一个第二个完美!这正是我想要的。