2017-01-13 12 views
1

私はデータベースから読み込み、値を文字列の配列に配置しようとしています。しかし、私は配列に値をプッシュしようとすると、アプリケーションがクラッシュする配列を印刷します。データベースから配列の値を読み込みます

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!) 

     } 
    }) 

私はunexpectedly found nil while unwrapping an Optional valueで配列アプリのクラッシュをプリントアウトする際に誰でも、データアウトなぜprint(value.key as! String)プリントを知っているが、いますか?

答えて

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) 

     } 
    }) 
+0

それはそれを修正するように見えました、私は多くのことを学ぶ必要があります...ありがとう。 – MarksCode

+0

FYI - 質の高い時間を過ごすことを強くお勧めします。http://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-valu?s = 1 | 6.4447 – rmaddy

1

あなたが使用して力アンラップにしようとすると、あなたの配列がnilです:あなたは問題ありませんself.pets?.append()を使用していると

print(self.pets!) 

をあなたがオプションの連鎖を使用しているので、あなたの配列は実際にはそれを使用する前に初期化するのを忘れているので、当時はnilです。代わりにself.pets!.append()を使用すると、ランタイムエラーが表示されます。

@rmaddyは、最初に配列を初期化するか、viewDidLoad()の内側に配列を初期化することをお勧めします。

私はこれがあなたに役立つことを願っています。

関連する問題