Comtesting si hay múltiples campos de text vacíos: iOS con Swift

Entonces, estoy desarrollando una pantalla de inicio de session de la aplicación. Estoy tratando de verificar cada campo en la pantalla de inicio de session para ver si está vacío, y si es así, muestre un post de error en una label al usuario. He estado usando una cadena de else-ifs

if ((self.firstNameField.text?.isEmpty) != nil) { errorLabel.text = "first name missing" errorLabel.hidden = false } else if ((self.lastNameField.text?.isEmpty) != nil) { errorLabel.text = "last name missing" errorLabel.hidden = false } else if ((self.emailField.text?.isEmpty) != nil) { errorLabel.text = "email missing" errorLabel.hidden = false } else if ((self.passwordField.text?.isEmpty) != nil) { errorLabel.text = "password missing" errorLabel.hidden = false } else if ((self.confirmPasswordField.text?.isEmpty) != nil) { errorLabel.text = "password confirmation missing" errorLabel.hidden = false } else if (self.passwordField.text != self.confirmPasswordField.text) { errorLabel.text = "Passwords don't match, try again!" errorLabel.hidden = false } //omitted what happens if there are no fields missing 

Ahora, cuando ejecuto la aplicación con todos los campos de text vacíos, errorLabel muestra el post "nombre faltante". Poner un nombre y presionar el button de logging no hace nada. Quiero que cambie a "apellido faltante", pero permanece en "nombre faltante".

La razón por la que esto sucede es porque está comprobando si self.field.text?.isEmpty != nil . Deberías estar buscando (self.field.text?.isEmpty ?? true)

Esencialmente, está intentando get el text en el campo, y si no hay text, se devuelve nil . ¿Al usar field.text? , estás haciendo la siguiente variable a la que accedes nil según si field.text es nil. Entonces, cuando no hay text, field.text == nil , hacer field.text?.isEmpty siempre devolverá nil.

Cuando hay text, field.text?.isEmpty no será nil y siempre será falso, pero nil != false , por lo que la statement siempre devolverá false .

Para solucionarlo, debe verificar

 if(self.field.text?.isEmpty ?? true) 

que esencialmente significa

 if((self.field.text?.isEmpty == nil ? true : self.field.text?.isEmpty)) 

Básicamente, esto volverá verdadero si field.text == nil (que haría field.text?.isEmpty nil, haciendo que el resultado sea true debido al operador ?? ), Y también devolverá true if field.text != nil || field.text.isEmpty field.text != nil || field.text.isEmpty . Solo devolverá false si self.field.text != nil && !self.field.text.isEmpty .

Otra forma de escribir esta statement sería

 if(self.field.text == nil || self.field.text!.isEmpty) 

Probar esto:

 if self.firstNameField.text?.isEmpty { errorLabel.text = "first name missing" errorLabel.hidden = false } else if self.lastNameField.text?.isEmpty { errorLabel.text = "last name missing" errorLabel.hidden = false } else if self.emailField.text?.isEmpty { errorLabel.text = "email missing" errorLabel.hidden = false } else if self.passwordField.text?.isEmpty { errorLabel.text = "password missing" errorLabel.hidden = false } else if self.confirmPasswordField.text?.isEmpty { errorLabel.text = "password confirmation missing" errorLabel.hidden = false } else if (self.passwordField.text != self.confirmPasswordField.text) { errorLabel.text = "Passwords don't match, try again!" errorLabel.hidden = false } 

Probar esto:

 if self.firstNameField.text! == "" { errorLabel.text = "first name missing" errorLabel.hidden = false } else if self.lastNameField.text! == "" { errorLabel.text = "last name missing" errorLabel.hidden = false } else if self.emailField.text! == "" { errorLabel.text = "email missing" errorLabel.hidden = false } else if self.passwordField.text! == "" { errorLabel.text = "password missing" errorLabel.hidden = false } else if self.confirmPasswordField.text! == "" { errorLabel.text = "password confirmation missing" errorLabel.hidden = false } else if !(self.passwordField.text! == self.confirmPasswordField.text!) { errorLabel.text = "Passwords don't match, try again!" errorLabel.hidden = false }