Ios 正在尝试读取数据库用户的详细信息,并将其打印为可选值

Ios 正在尝试读取数据库用户的详细信息,并将其打印为可选值,ios,swift,firebase,Ios,Swift,Firebase,试图从firebase检索用户,但无法说明返回可选值的错误,代码已附加在下面。 我也在下面添加了调试器消息 代码 var ref = FIRDatabaseReference.init() @IBOutlet weak var points: UILabel! @IBOutlet weak var currentUser: UILabel! override func viewDidLoad() { super.viewDidLoad() ref = FIRDatabase.

试图从firebase检索用户,但无法说明返回可选值的错误,代码已附加在下面。 我也在下面添加了调试器消息

代码

var ref = FIRDatabaseReference.init()

@IBOutlet weak var points: UILabel!
@IBOutlet weak var currentUser: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    ref = FIRDatabase.database().reference()
}

func setupProfile(){
    let uid = FIRAuth.auth()?.currentUser?.uid
    let ref = FIRDatabase.database().reference().child("users").child(uid!)
    ref.observeSingleEvent(of: .value, with: { snapshot in

    if let dictionary = snapshot.value as? [String: AnyObject] {

            let username1 = dictionary["username"] as! String
            print(username1)
            self.username.text = username1//Error is caused on this line EXC_BAD_Instruction
            //   ( code= EXC_I386_INVOP,subcode = 0x0)

        } 

    })
}
自动委托代理。要禁用代理,请在Info.plist快照(fpzfqMTapNel8F90q8bEO450eYg1)中将标志FirebaseAppDelegateProxyEnabled设置为否{ 电子邮件=”abcd@test.com“;
点数=100;
username=abcd;}致命错误:在展开可选值(lldb)时意外发现nil}


回答以下问题:如果快照中的值为零,则代码格式不正确,可能会崩溃。i、 例如,这意味着您试图访问snapshot.value中的键“username”(作为字典),但“username”键不存在

下面是一些带有两个选项的建议代码

    let uid = FIRAuth.auth()?.currentUser?.uid
    let ref = FIRDatabase.database().reference().child("users").child(uid)
    ref.observeSingleEvent(of: .value, with: { snapshot in

         //make sure dict is available before proceeding
         if let dict = snapshot.value as? [String: AnyObject] {

              //this is a test in response to a comment
              let email = dictionary["email"] as! String
              print(email)
              self.user.text = email

              ///if you are sure the 'username' key will always exist (neve
              let username = dictionary["username"] as! String
              print(username)
              self.user.text = username

              //if you are unsure if the 'username' will exist or not, protect your code!
              if let username = dict["username"] as? String {
                   //do something with username
              }
         } 

    })
为了配合这些评论,理解选项是使用Swift和保护您的代码(和用户)的关键


还有其他选项可以保护您的代码,但请先尝试一下。

了解Optionals的工作原理,这里有很好的解释:谢谢Eric的快速回复,但不幸的是,我之前已经在该页面上,试图理解我犯的错误。我尝试了多种方法。但它仍然显示相同的错误:(.好的。那么让我们试着把问题的范围缩小一点。我的意思是,你应该从问题中删除与问题无关的代码,这样人们可能更容易看到错误。你还应该指出哪一行导致了崩溃,并检查当它崩溃时调试器中的值。在集合中upProfile方法为什么要在字符串后加?删除该字符串,然后尝试删除?后字符串仍然不起作用,我已经尝试过了@Jay,非常感谢@Jay的惊人响应,这里的问题是,如果我在调试器中为用户名赋值,它实际上会打印用户名,例如,在分配self.user.text=username时它给出了一个错误,表示意外值是可选值。@ZahidAhmed问题是这里的变量太多(不是在代码中),因此我们需要找出问题所在。我稍微更改了答案,以帮助找出问题。请尝试我所做的操作,看看是否仍然存在错误。您所做的更改正是我在最终确定错误仍然存在之前所做的更改:(.我不知道这里会出现什么问题。但非常感谢您在这方面的帮助。@ZahidAhmed是否打印用户名,错误是否会发生在下一行?只要用户类对象的VAR设置正确,我的答案中的代码就可以工作。正确打印用户名,错误会发生在下一行。VAR已被删除设置也正确