2016-07-28 5 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 4 и log in 4.1, но не 4.2. Ошибка должна произойти в строке между ними. Я проверяю, что snapshot.value не ноль, но он по-прежнему печатает ноль. Как я могу это решить? Благодаря!

+5

'snapshot.value [«имя пользователя»]' вернет ноль, если нет никакого значения для 'username' в словаре. Вы должны научиться использовать отладчик и одиночный степпинг, а не полагаться на записи журнала. – Paulw11

+0

@ Paulw11 почему вы не опубликовали это как ответ? – Losiowaty

+1

Это может быть не ответ (хорошо, наверное), но я предпочитаю, чтобы у меня появилась возможность подтвердить комментарии, прежде чем отправлять ответ – Paulw11

ответ

0

Вы в настоящее время просто проверить, что snapshot.value содержит любого значения, поэтому не nil. Но это не означает, что snapshot.value содержит значение "username".

Если это пустая инициализация, это также не ноль.

Так, чтобы проверить для этого конкретного ключа вы должны добавить проверку для самого ключа:

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

Вы должны использовать опциональным связывание, чтобы получить значение, которое вы хотите разворачивать ...

if let username = snapshot.value?["username"] { 
    // now you can use username safely 
} 
Смежные вопросы