将数据库中的值读入Array

时间:2017-01-13 04:51:35

标签: ios swift firebase firebase-realtime-database

我试图从数据库中读取并将值放入字符串数组中。但是,当我尝试将值推送到数组中时,打印应用程序崩溃的数组。

var pets: [String]?

override func viewDidLoad() {
    super.viewDidLoad()

    let userRef = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("pets")
    userRef.observeSingleEvent(of: .value, with: { snapshot in
        if let snap = snapshot.value as? Bool {
            print("no values")
        } else if let snap = snapshot.value as? NSDictionary {
            for value in snap {
                print(value.key as! String)    // Prints out data in the database
                self.pets?.append(value.key as! String)
            }
            print(self.pets!)

        }
    })

有人知道为什么print(value.key as! String)打印出数据,但是当我打印出数组时,应用程序会与unexpectedly found nil while unwrapping an Optional value崩溃吗?

2 个答案:

答案 0 :(得分:1)

您永远不会初始化pets。您将其声明为可选,但从不为其赋值。为什么不将代码更改为以下内容:

var pets = [String]() // start with an empty array 

override func viewDidLoad() {
    super.viewDidLoad()

    let userRef = FIRDatabase.database().reference().child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("pets")
    userRef.observeSingleEvent(of: .value, with: { snapshot in
        if let snap = snapshot.value as? Bool {
            print("no values")
        } else if let snap = snapshot.value as? NSDictionary {
            for value in snap {
                print(value.key as! String)    // Prints out data in the database
                self.pets.append(value.key as! String)
            }
            print(self.pets)

        }
    })

答案 1 :(得分:1)

当您尝试强行展开时,您的数组为nil

print(self.pets!)

当你使用self.pets?.append()时,你没有任何问题,因为你正在使用可选项的链接,但你的数组实际上是nil,因为你忘记了在使用之前初始化它。如果改为使用self.pets!.append(),则会看到运行时错误。

因此@rmaddy建议您可以在开始时或在viewDidLoad()内部初始化阵列。

我希望这对你有所帮助。