Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift初始化对象以在Firebase上获取可选值_Ios_Swift_Firebase_Firebase Realtime Database_Initializer - Fatal编程技术网

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

还显示一个示例,说明您要使用什么来初始化它。这看起来应该有效,但实际上无效。假设我希望摘要是
可选的
。如果我尝试初始化它,它将不起作用,因为参数不存在。哦,我现在明白了,给我一个第二个完美!这正是我想要的。