Search code examples
swift3

Password Filed Validation not working in Swift 3


I had multiple images based on the text changes in textfield I need to change the image as selected like when user enter capital letter and small letter and special character and number based on that image get selected ..but I can't change according that. here is my code:

@IBAction func textFieldEditingChanged(_ sender: Any) {

    if isValidated(passwordTextField.text!){

       print("succ")
    }
}

func isValidated(_ password: String) -> Bool {
    var lowerCaseLetter: Bool = false
    var upperCaseLetter: Bool = false
    var digit: Bool = false
    var specialCharacter: Bool = false

    for char in password.unicodeScalars {
        if !lowerCaseLetter {
            lowerCaseLetter = CharacterSet.lowercaseLetters.contains(char)

        }
        if !upperCaseLetter {
            upperCaseLetter = CharacterSet.uppercaseLetters.contains(char)
        }
        if !digit {
            digit = CharacterSet.decimalDigits.contains(char)
        }

        if !specialCharacter {
            specialCharacter = CharacterSet.punctuationCharacters.contains(char)
        }
    }

    if  (specialCharacter) {
        //do what u want
        self.SpecialCharacter_img.image = UIImage(named: "GreenTick")
        return false
    }
    if  ( digit) {
        //do what u want
        self.onenumberImageCondiotion_img.image = UIImage(named: "GreenTick")
        return false
    }

    if  ( lowerCaseLetter && upperCaseLetter) {
        //do what u want
        self.UpperCaseImageConditions_img.image = UIImage(named: "GreenTick")
        return false
    }
    else {
        self.UpperCaseImageConditions_img.image = UIImage(named: "redtick")
        self.SpecialCharacter_img.image = UIImage(named: "redtick")
        self.onenumberImageCondiotion_img.image = UIImage(named: "redtick")
        return false
    }
}

Solution

  • Your code in the isValidated method just needs a little tweaking:

    I changed it a little bit and it works in my test project.

    func isValidated(_ password: String) -> Bool {
        var lowerCaseLetter: Bool = false
        var upperCaseLetter: Bool = false
        var digit: Bool = false
        var specialCharacter: Bool = false
    
        for char in password.unicodeScalars {
            if !lowerCaseLetter {
                lowerCaseLetter = CharacterSet.lowercaseLetters.contains(char)
    
            }
            if !upperCaseLetter {
                upperCaseLetter = CharacterSet.uppercaseLetters.contains(char)
            }
            if !digit {
                digit = CharacterSet.decimalDigits.contains(char)
            }
    
            if !specialCharacter {
                specialCharacter = CharacterSet.punctuationCharacters.contains(char)
            }
        }
    
        if  (lowerCaseLetter) {
            lowercaseLabel.text = "✅ Has a lowercase letter"
            lowercaseLabel.textColor = .green
            lowercaseLabel.sizeToFit()
        } else {
            lowercaseLabel.text = "Does not have a lowercase letter"
            lowercaseLabel.textColor = .red
            lowercaseLabel.sizeToFit()
        }
    
        if (upperCaseLetter) {
            uppercaseLabel.text = "✅ Has an uppercase letter"
            uppercaseLabel.textColor = .green
            uppercaseLabel.sizeToFit()
        } else {
            uppercaseLabel.text = "Does not have an uppercase letter"
            uppercaseLabel.textColor = .red
            uppercaseLabel.sizeToFit()
        }
    
        if  (specialCharacter) {
            specialLabel.text = "✅ Has a special character"
            specialLabel.textColor = .green
            specialLabel.sizeToFit()
        } else {
            specialLabel.text = "Does not have a special character"
            specialLabel.textColor = .red
            specialLabel.sizeToFit()
        }
    
        if  (digit) {
            numberLabel.text = "✅ Has a number"
            numberLabel.textColor = .green
            numberLabel.sizeToFit()
        } else {
            numberLabel.text = "Does not have a number"
            numberLabel.textColor = .red
            numberLabel.sizeToFit()
        }
    
        if lowerCaseLetter && upperCaseLetter && digit && specialCharacter {
            return true
        } else {
            return false
        }
    

    The last part is important where you have to check that all the conditions are true, or else return false. Also, I removed the return false code in each of the sections where you put '// do what you want' because I don't think the function should return false except at the final check.

    Then in the specific 'if statements' where you check for each subcondition being true, add an else statement that will toggle/set your images for either state (e.g. green tick for true, red X for false).

    Project Code: https://github.com/Wattholm/PasswordValidator