2016-07-28 22 views
1

Firebaseユーザ名をUserDefaultに保存しようとしています。nilをチェックした後に予期せずnilが見つかる

let databaseRef = FIRDatabase.database().reference() 
databaseRef.child("Users").child((FIRAuth.auth()?.currentUser?.uid)!).observe(.value, with: { (snapshot) in 
    print("log in 4") 
    print(snapshot.value) 
    if snapshot.value != nil { 
     print("log in 4.1") 
     UserDefaults.standard.set(snapshot.value!["username"], forKey: "username")//Crash probably occurs here 
     print("log in 4.2") 
    } 

}) 

システムのプリントlog in 4log in 4.1ではなく、4.2:ここでは、私が持っているものです。その間にある行でエラーが発生している必要があります。私はsnapshot.valueがnilではないことをチェックしますが、それでもnilを出力します。どうすれば解決できますか?ありがとう!

+5

'snapshot.value [「ユーザー名」]の値がない場合は、' nilを返します。 'username'キーを押します。ログステートメントに頼るのではなく、デバッガとシングルステップを使用する方法を学ぶ必要があります。 – Paulw11

+0

@ Paulw11なぜこれを回答として投稿しませんでしたか? – Losiowaty

+1

それは答えではないかもしれませんが(確かにそうです)、私は質問者に答えを投稿する前にコメントで確認する機会を与えることを好むです。 – Paulw11

答えて

0

は現在、ちょうどそうnilではない、snapshot.valueどんな値が含まれていることを確認しています。しかし、それはsnapshot.valueに値"username"が含まれているわけではありません。

初期化されていない場合は、nilでもありません。

ですから、キー自体のチェックを追加する必要があるだろう、この特定のキーをチェックします

if let userValue = snapshot.value?["username"] 
0

あなたはアンラップする値を取得するには、オプションのバインディングを使用する必要があります...

if let username = snapshot.value?["username"] { 
    // now you can use username safely 
} 
関連する問題