Как исправить неожиданно найденный nil при неявном развертывании необязательного значения?

Я знаю, что в Интернете есть множество сообщений об этом, я также знаю, что означает это сообщение об ошибке, я сталкивался с ним не менее 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()
                
            }
        
        
    }
    
    
    
    
    
    
    

}
}
}

Это происходит в первых двух строках кода. Если бы кто-нибудь мог помочь, это было бы очень признательно.


person appledeveloper123    schedule 02.07.2020    source источник
comment
Если вы знаете, что означает сообщение об ошибке, то вы понимаете, что свойство .text либо emailSignIn, либо paasswordSignIn равно nil. Как вы ожидаете, что мы поможем вам понять, почему, не видя, как вы присвоили им значение?   -  person New Dev    schedule 02.07.2020
comment
Узнайте о дополнительных возможностях, иначе ваше путешествие в Swift будет состоять только из борьбы с ними и страданий.   -  person Alexander    schedule 02.07.2020
comment
@NewDev, что вы имеете в виду, как я присвоил им значение?   -  person appledeveloper123    schedule 02.07.2020
comment
@appledeveloper123 @appledeveloper123 - предположительно, вы ожидаете, что emailSignIn.text и/или passwordSignIn.text не будут nil, поэтому где-то этому свойству должно было быть присвоено значение, но оно не было присвоено. Это не в коде, который вы показали. Другими словами, ваша ошибка не воспроизводится с кодом, который вы разместили в вопросе.   -  person New Dev    schedule 02.07.2020
comment
@NewDev У меня есть куча другого кода, и когда дело доходит до этого, я просто пытаюсь создать свою первую страницу регистрации и входа. emailSignIn и passwordSignIn - это просто текстовые поля, в которые пользователь вводит для входа. Я думаю, мой вопрос в том, как мне предотвратить это от нуля?   -  person appledeveloper123    schedule 02.07.2020
comment
Прочтите об необязательной привязке. nil перед выполнением каких-либо действий, основанных на этих значениях.   -  person New Dev    schedule 02.07.2020


Ответы (1)


Если перед использованием необходимо убедиться, что значения не равны нулю, используйте необязательная привязка, чтобы убедиться, что и при необходимости извлечь их ненулевое значение:

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...
   }
}
person New Dev    schedule 02.07.2020
comment
Я только что попытался добавить следующий код, и все равно не повезло - person appledeveloper123; 02.07.2020
comment
Не уверен, что вы имеете в виду под невезением, но с этим кодом вы определенно не должны получить найденное нулевое исключение @appledeveloper123 - person New Dev; 02.07.2020
comment
Cannot convert value of type '() -> ()' to expected argument type 'AuthDataResultCallback?' (aka 'Optional<(Optional<AuthDataResult>, Optional<Error>) -> ()>')теперь я получаю это сообщение об ошибке - person appledeveloper123; 02.07.2020
comment
Это похоже на другую ошибку - person New Dev; 02.07.2020
comment
Я только что просмотрел эту ошибку, и основное решение - вернуться к тому, как я это делал. [stackoverflow.com/questions/50550097/ - person appledeveloper123; 02.07.2020
comment
Это скорее обнаруживает новую ошибку :) - person New Dev; 02.07.2020
comment
Я только что отредактировал свой комментарий ^ - person appledeveloper123; 02.07.2020
comment
@appledeveloper123 @appledeveloper123 - я не могу вам помочь, когда есть другие ошибки, не связанные с опубликованным вами кодом. Не уверен, что ссылка, которую вы прокомментировали, относится к - person New Dev; 02.07.2020
comment
Я только что обновил свой ответ на весь код, который у меня есть, относящийся к входу и регистрации, и ссылка тоже является новым сообщением об ошибке, которое я получаю - person appledeveloper123; 02.07.2020
comment
Ответ не помогает, потому что свойство text UITextField никогда не бывает nil - person vadian; 02.07.2020
comment
@vadian, я ответил на это до того, как вопрос был отредактирован с дополнительной информацией - person New Dev; 02.07.2020