Bagaimana cara memperbaiki nil yang ditemukan secara tidak terduga saat secara implisit membuka bungkus nilai Opsional? [duplikat]

Saya tahu ada banyak sekali postingan di internet tentang ini, saya juga tahu apa maksud pesan kesalahan ini, saya sudah menemukannya setidaknya 50 kali. Meskipun saya telah mencoba sekitar 1 jam dan saya tidak tahu mengapa saya mendapatkan kesalahan ini pada kode ini:

        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()
                
            }
        
        
    }
    
    
    
    
    
    
    

}
}
}

Itu terjadi di dua baris kode pertama. Jika ada yang bisa membantu, itu akan sangat dihargai.


person appledeveloper123    schedule 02.07.2020    source sumber
comment
Jika Anda mengetahui arti pesan kesalahan tersebut, maka Anda memahami bahwa properti .text dari emailSignIn atau paasswordSignIn adalah nil. Bagaimana Anda mengharapkan kami membantu Anda mengetahui mengapa, tanpa melihat bagaimana Anda memberikan nilai pada hal tersebut?   -  person New Dev    schedule 02.07.2020
comment
Belajarlah tentang pilihan, atau perjalanan Swift Anda hanya akan berisi perjuangan dan penderitaan   -  person Alexander    schedule 02.07.2020
comment
@NewDev, apa maksud Anda dengan cara saya memberikan nilai kepada mereka?   -  person appledeveloper123    schedule 02.07.2020
comment
@ appledeveloper123 - mungkin, Anda mengharapkan emailSignIn.text dan/atau passwordSignIn.text bukan nil, jadi di suatu tempat properti ini seharusnya diberi nilai, tetapi ternyata tidak. Itu tidak ada dalam kode yang Anda tunjukkan. Jadi, dengan kata lain, bug Anda tidak dapat direproduksi dengan kode yang Anda posting di pertanyaan.   -  person New Dev    schedule 02.07.2020
comment
@NewDev Saya memiliki banyak kode lain dan ketika itu benar-benar terjadi, saya hanya mencoba membuat halaman pendaftaran dan masuk pertama saya. emailSignIn dan passwordSignIn keduanya hanyalah kolom teks tempat pengguna masuk untuk masuk. Saya kira pertanyaan saya adalah bagaimana cara mencegahnya menjadi nihil?   -  person appledeveloper123    schedule 02.07.2020
comment
Baca tentang pengikatan opsional - Anda dapat memastikan bahwa keduanya tidak nil sebelum Anda melakukan beberapa tindakan yang bergantung pada nilai-nilai ini.   -  person New Dev    schedule 02.07.2020


Jawaban (1)


Jika Anda perlu memastikan bahwa nilainya bukan nihil sebelum menggunakannya, gunakan pengikatan opsional untuk memastikannya dan secara opsional mengekstrak nilai bukan nihilnya:

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
Saya baru saja mencoba memasukkan kode berikut dan masih belum berhasil - person appledeveloper123; 02.07.2020
comment
Tidak yakin apa yang Anda maksud dengan tidak beruntung, tetapi dengan kode ini Anda pastinya tidak akan mendapatkan pengecualian found nil @appledeveloper123 - person New Dev; 02.07.2020
comment
Cannot convert value of type '() -> ()' to expected argument type 'AuthDataResultCallback?' (aka 'Optional<(Optional<AuthDataResult>, Optional<Error>) -> ()>')sekarang saya menerima pesan kesalahan ini - person appledeveloper123; 02.07.2020
comment
Kedengarannya seperti kesalahan yang berbeda - person New Dev; 02.07.2020
comment
Saya baru saja mencari kesalahan ini dan solusi utamanya adalah kembali ke cara saya sebelumnya. [stackoverflow.com/questions/50550097/ - person appledeveloper123; 02.07.2020
comment
Ini malah mengungkap kesalahan baru :) - person New Dev; 02.07.2020
comment
Saya baru saja mengedit komentar saya^ - person appledeveloper123; 02.07.2020
comment
@ appledeveloper123 - Saya tidak dapat membantu Anda jika ada kesalahan lain yang tidak terkait dengan kode yang Anda posting. Tidak yakin tautan yang Anda komentari itu mengacu pada apa - person New Dev; 02.07.2020
comment
Saya baru saja memperbarui jawaban saya untuk semua kode yang saya miliki terkait dengan masuk dan mendaftar, dan tautannya juga merupakan pesan kesalahan baru yang saya terima - person appledeveloper123; 02.07.2020
comment
Jawabannya tidak membantu karena properti text dari UITextField tidak pernah nil - person vadian; 02.07.2020
comment
@vadian, saya menjawab ini sebelum pertanyaan diedit dengan info lebih lanjut - person New Dev; 02.07.2020