【问题标题】:How to fix Unexpectedly found nil while implicitly unwrapping an Optional value? [duplicate]如何在隐式展开可选值时修复意外发现的 nil? [复制]
【发布时间】:2020-10-22 12:46:36
【问题描述】:

我知道网上有很多关于这个的帖子,我也知道这个错误信息是什么意思,我遇到过至少 50 次。虽然我已经尝试了大约 1 小时,但我不知道为什么我在此代码上收到此错误:

        usernameSignUp?.setPadding()
        emailSignUp?.setPadding()
        passwordSignUp?.setPadding()
        usernameSignUp?.setBottomBorder()
        emailSignUp?.setBottomBorder()
        passwordSignUp?.setBottomBorder()
        emailSignIn?.setPadding()
        emailSignIn?.setBottomBorder()
        passwordSignIn?.setPadding()
        passwordSignIn?.setBottomBorder()
        
        signUpButton?.layer.cornerRadius = 4
        
    
    }
    
    func validateFields() -> String? {
        
        if usernameSignUp.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
            emailSignUp.text?.trimmingCharacters(in: .whitespacesAndNewlines) == "" ||
            passwordSignUp.text?.trimmingCharacters(in: .whitespacesAndNewlines) == ""{
            
            
            return "Please fill in all fields"
        }
        
        let cleanedPassword = passwordSignUp.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        
        if isPasswordValid(cleanedPassword) == false {
            
            return "8 characters or more"
            
        }
        
        
        return nil
    }
    
  
    @IBAction func signUpTapped(_ sender: Any) {
        
        let error = validateFields()
              
              if error != nil {
                  
                  showError(error!)
    }
              
              else {
                
                let userName = usernameSignUp.text!.trimmingCharacters(in: .whitespacesAndNewlines)
                let email = emailSignUp.text!.trimmingCharacters(in: .whitespacesAndNewlines)
                let password = passwordSignUp.text!.trimmingCharacters(in: .whitespacesAndNewlines)
                
                
                Auth.auth().createUser(withEmail: email, password: password) { (result, error) in
                    
                    if error != nil {
                        
                        self.showError("Invalid email")
                        
                        
                    }
                    else {
                        
                        let db = Firestore.firestore()
                        
                        db.collection("users").addDocument(data: ["username": userName, "uid": result!.user.uid]) { (error) in
                            
                            if error != nil {
                                
                                self.showError("Username could not be created")
                                
                            }
                            
                            
                        }
                        
                        self.transitionToHome()
                        
                        
                    }
                    
                    
                }
                
        }
    
        
    }
    
     func isPasswordValid(_ password : String) -> Bool {
        
        let passwordTest = NSPredicate(format: "SELF MATCHES %@", ".{8,}")
        
        return passwordTest.evaluate(with: password)
    }
    
    func showError(_ message:String) {
        
        errorLabel.text = message
        errorLabel.alpha = 1
        
    }
    
    func transitionToHome() {
        
        let homeViewController = storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? ViewController
        
        view.window?.rootViewController = homeViewController
        
        view.window?.makeKeyAndVisible()
        
        
    }
    
    
    
    @IBAction func emailLoginTapped(_ sender: Any) {
        
        
    }
    
    
    
    @IBAction func loginTapped(_ sender: Any) {
        
        
        if let emailsignin = emailSignIn.text?.trimmingCharacters(in: .whitespacesAndNewlines),

            let passwordsignin = passwordSignIn.text?.trimmingCharacters(in: .whitespacesAndNewlines) {
        
        Auth.auth().signIn(withEmail: emailsignin, password: passwordsignin) { (result, error) in
          
            
            if error != nil {
            
                self.errorLabel3.text = error!.localizedDescription
                self.errorLabel3.alpha = 1
                
            
            
        }
            else {
                
                
                self.transitionToHome()
                
            }
        
        
    }
    
    
    
    
    
    
    

}
}
}

它发生在前两行代码中。如果有人可以提供帮助,将不胜感激。

【问题讨论】:

  • 如果您知道错误消息的含义,那么您就知道emailSignInpaasswordSignIn.text 属性是nil。您希望我们如何帮助您找出为什么,而无需了解您如何为他们分配价值?
  • 了解可选选项,否则您的 Swift 之旅将只包括与它们抗争和受苦
  • @NewDev 你是什么意思我是怎么给他们赋值的?
  • @appledeveloper123 - 大概,您希望emailSignIn.text 和/或passwordSignIn.text 不是nil,所以在某个地方应该为这个属性分配一个值,但没有。它不在您显示的代码中。因此,换句话说,您在问题中发布的代码无法重现您的错误。
  • @NewDev 我还有一堆其他代码,当它真的归结为它时,我只是想让我的第一个注册和登录页面。 emailSignInpasswordSignIn 都只是用户输入登录的文本字段。我想我的问题是如何防止它为零?

标签: swift xcode optional fatal-error


【解决方案1】:

如果您需要在使用它们之前确保这些值不是 nil,请使用 optional binding 确保并选择提取它们的非 nil 值:

if let emailText = emailSignIn.text?.trimmingCharacters(in: .whitespacesAndNewlines), 
   let passwordText = passwordSignIn.text?.trimmingCharacters(in: .whitespacesAndNewlines) {

   Auth.auth().signIn(withEmail: emailText, password: passwordText) { (result, err) in
      // etc...
   }
}

【讨论】:

  • 我刚刚尝试替换以下代码,但仍然没有成功
  • 不确定你所说的“没有运气”是什么意思,但是使用这段代码你绝对不应该得到一个“found nil”异常@appledeveloper123
  • Cannot convert value of type '() -> ()' to expected argument type 'AuthDataResultCallback?' (aka 'Optional<(Optional<AuthDataResult>, Optional<Error>) -> ()>')现在我收到此错误消息
  • 这听起来像是另一个错误
  • 我刚刚查找了这个错误,主要的解决方案是回到我原来的方式。 [stackoverflow.com/questions/50550097/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多