Если у вас есть необязательное значение, вы должны предположить, что оно может быть ноль, и вам нужно решить, что вы хотите сделать, если оно ноль.
"?" Означает: я знаю, что это необязательно, если это ноль, то дайте мне необязательное значение вместо сбоя.
"!" означает: я знаю, что это необязательно, но я на 100% уверен, что это не может быть ноль. Пожалуйста, сбой, если я не прав.
let uid = Auth.auth().currentUser?.uid
означает, что из-за? в currentUser? если currentUser равен nil, ваше приложение не аварийно завершает работу, но выдает uid, равный nil. Так что вы собираетесь делать, если это ноль? Вы решаете.
В следующей строке
Database.database().reference().child("users").child(uid!)
"!" в UID! означает "Я уверен на 100%, что uid не ноль, пожалуйста, вылетает, если это так". И ваше приложение делает, как вы просили.
«Я обновил свой код. Я думаю, что все правильно. Однако я уверен, что это не так». Это истинная мудрость. Это серьезно.
Поскольку currentUser == nil, я бы нашел все места, где установлен currentUser, проверил, может ли какое-либо из этих мест установить currentUser равным nil, и почему ни одно из мест, которое могло бы установить его на что-то, отличное от nil, не будет выполнено. Объект равен нулю, когда его не должно быть, если кто-то устанавливает его на ноль, а кто-то не должен, или тот, кто должен установить его на ноль - нет.