Check if Swift text field contains non-whitespace

Swift

Swift Problem Overview


This is an extension, not a duplicate, of https://stackoverflow.com/questions/24102641/how-to-check-if-a-text-field-is-empty-or-not-in-swift

The given answer,

@IBAction func Button(sender: AnyObject) {
    if textField1.text != ""  {
        // textfield 1 
    }
}

does not work for me, i.e., the if-loop is triggered even when nothing is entered in the text field. (I have modified it from the original because I'm looking to trigger the code only when the field contains text).

The second answer

@IBAction func Button(sender: AnyObject) {
    if !textField1.text.isEmpty{

    }
}

comes much closer, but it accepts strings like " " as not empty. I could build something myself, but is there a function that will check if a string contains something other than whitespace?

Swift Solutions


Solution 1 - Swift

This answer was last revised for Swift 5.2 and iOS 13.5 SDK.


You can trim whitespace characters from your string and check if it's empty:

if !textField1.text.trimmingCharacters(in: .whitespaces).isEmpty {
    // string contains non-whitespace characters
}

You can also use .whitespacesAndNewlines to remove newline characters too.

Solution 2 - Swift

Below is the extension I wrote that works nicely, especially for those that come from a .NET background:

extension String {
    func isEmptyOrWhitespace() -> Bool {
        
        if(self.isEmpty) {
            return true
        }
        
        return (self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) == "")
    }
}

Solution 3 - Swift

Swift 4.2

Extension for String is empty or whitespace

extension String {
    func isEmptyOrWhitespace() -> Bool {
        
        // Check empty string
        if self.isEmpty {
            return true
        }
        // Trim and check empty string
        return (self.trimmingCharacters(in: .whitespaces) == "")
    }
}

The original poster's code is checking text on a textfield which is optional. So he will need some code to check optional strings. So let's create a function to handle that too:

Extension for Optional String is nil, empty or whitespace

extension Optional where Wrapped == String {
    func isEmptyOrWhitespace() -> Bool {
        // Check nil
        guard let this = self else { return true }
        
        // Check empty string
        if this.isEmpty {
            return true
        }
        // Trim and check empty string
        return (this.trimmingCharacters(in: .whitespaces) == "")
    }
}

Solution 4 - Swift

akashivskyy answer in Swift 3.0:

let whitespaceSet = CharacterSet.whitespaces
if !str.trimmingCharacters(in: whitespaceSet).isEmpty {
  // string contains non-whitespace characters
}

Solution 5 - Swift

extension StringProtocol where Index == String.Index {
    var isEmptyField: Bool {
        return trimmingCharacters(in: .whitespaces) == ""
    }
}


if yourTextField.text.isEmptyField {
    // Field is empty
} else {
    // Field is NOT empty
}

Solution 6 - Swift

Answer in swift 4:

extension String {
    func isEmptyOrWhitespace() -> Bool {
        if(self.isEmpty) {
            return true
        }
        return (self.trimmingCharacters(in: NSCharacterSet.whitespaces) == "")
    }
}

Solution 7 - Swift

Answer in Swift 3.0

if stringValue.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty
{}

Solution 8 - Swift

Answer in Swift 3.*, considers newlines, tabs

extension String {
 
    var containsNonWhitespace: Bool {
        return !self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
    }

}

Solution 9 - Swift

Answer with a picture in case you need a demo

// MY FUNCTIONS
private func checkMandatoryFields(){
    
    //CHECK EMPTY OR SPACES ONLY FIELDS
    if let type = typeOutle.text, let name = nameOutlet.text, let address = addressOutlet.text, type.trimmingCharacters(in: .whitespaces).isEmpty || name.trimmingCharacters(in: .whitespaces).isEmpty || address.trimmingCharacters(in: .whitespaces).isEmpty {
        print("Mandatory fields are: ")
        errorDisplay(error: "Mandatory fields are: Type, Name, Address.")
        return
    }
    
}

enter image description here

Solution 10 - Swift

swift 4.2

@IBAction func checkSendButton(_ sender: UITextField) {
    if((sender.text?.count)! > 0 && !(sender.text!.trimmingCharacters(in: .whitespaces)).isEmpty){
        self.sendButton.isEnabled = true
    }
    else{
        self.sendButton.isEnabled = false
    }
}

Solution 11 - Swift

Method

 func trim() -> String {
    return self.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
}

Use

if textField.text.trim().count == 0 {
    // Do your stuff
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionthumbtackthiefView Question on Stackoverflow
Solution 1 - SwiftakashivskyyView Answer on Stackoverflow
Solution 2 - SwiftDoolaliView Answer on Stackoverflow
Solution 3 - SwiftMark MoeykensView Answer on Stackoverflow
Solution 4 - SwiftronatoryView Answer on Stackoverflow
Solution 5 - SwiftLeo DabusView Answer on Stackoverflow
Solution 6 - SwiftDylanView Answer on Stackoverflow
Solution 7 - SwiftVishnu GuptaView Answer on Stackoverflow
Solution 8 - SwiftKimJView Answer on Stackoverflow
Solution 9 - SwiftcodersView Answer on Stackoverflow
Solution 10 - SwiftAhmed SafadiView Answer on Stackoverflow
Solution 11 - SwiftPrabakaran MuthusamyView Answer on Stackoverflow