วิธีแก้ไขไม่พบศูนย์โดยไม่คาดคิดในขณะที่แกะค่าทางเลือกโดยปริยาย [ทำซ้ำ]

ฉันรู้ว่ามีโพสต์มากมายบนอินเทอร์เน็ตเกี่ยวกับเรื่องนี้ ฉันรู้ว่าข้อความแสดงข้อผิดพลาดนี้หมายถึงอะไร ฉันพบมันอย่างน้อย 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 - สมมุติว่าคุณคาดหวัง 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
ฉันเพิ่งลอง subbing รหัสต่อไปนี้ แต่ก็ยังไม่มีโชค - 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 - ฉันไม่สามารถช่วยคุณได้จริงๆเมื่อมีข้อผิดพลาดอื่น ๆ ที่ไม่เกี่ยวข้องกับรหัสที่คุณโพสต์ ไม่แน่ใจว่าลิงก์ที่คุณแสดงความคิดเห็นนั้นหมายถึงอะไร - 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