我试图从数据库中读取并将值放入字符串数组中。但是,当我尝试将值推送到数组中时,打印应用程序崩溃的数组。
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
崩溃吗?
答案 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()
内部初始化阵列。
我希望这对你有所帮助。