hazrpg
hazrpg

Reputation: 512

How can I check to see if a string contains characters of whitespace/alphanumeric/etc?

How can you use the "ctype.h" library in Swift to be able to use isAlpha or isSpace on characters? Or is there a better, Swift, way of doing it?

This question is answered, but it doesn't seem to work: Swift: how to find out if letter is Alphanumeric or Digit

It doesn't specify how to import the library. Could someone point me in the right direction?

Here's what I've got so far:

extension String {
    subscript (i : Int) -> String {
        return String(Array(self)[i])
    }
}

let whitespace = NSCharacterSet.whitespaceCharacterSet()

let phrase = "Test case"

for var i=0; i<countElements(phrase); i++ {
    if whitespace.characterIsMember(phrase[i]) { //error
        println("char is whitespace")
    }
}

Upvotes: 25

Views: 27551

Answers (7)

Rattanakoudom Sambath
Rattanakoudom Sambath

Reputation: 514

Or you can just use regex:

extension String {
   func isContainWhiteSpace() -> Bool {
       let whiteSpace = "\\s+"
       let predicate = NSPredicate(format: "SELF MATCHES %@", whiteSpace)
       return predicate.evaluate(with: self)
   }
}

Meaning:

"\s" mean Any white space character
"+" mean One or More of character
Notice the double back slash we can't use single back slash as it'll return error: Invalid escape sequence in literal so we need to use double back slash to avoid that error.

Usage:

let sample = " "
print(sample.isContainWhiteSpace() ? "Contain White Space" : "Acceptable White Space")

Note: I use this in case I want to validate when user try to input empty white space, this will prevent user to do so.

Upvotes: 1

J.Pimentel
J.Pimentel

Reputation: 1

This function will tell you if there is a whitespace between a string. for example if you are trying to make sure the user enter a first and last name

Swift 5

func validatTextField() -> Bool {
        var isValid = false
        if textField.text!.contains(" ") && !textField.text!.isEmpty{
            let cardHolderChar = textField.text!
            for i in cardHolderChar {
                if i == " " && i == cardHolderChar.last {
                    isValid = false
                }
                else {
                    isValid = true
                }
            }
        }
        return isValid
    }

Upvotes: -1

Samuel B.
Samuel B.

Reputation: 371

I created a String extension that does exactly this, hope it's useful.

extension String {
    func containsWhitespaceAndNewlines() -> Bool {
        return rangeOfCharacter(from: .whitespacesAndNewlines) != nil
    }
}

// Usage
"hello, world!".containsWhitespaceAndNewlines() // true
"hello,world!".containsWhitespaceAndNewlines() // false

Upvotes: 12

kauai
kauai

Reputation: 504

For Swift 5

extension String {

    func containsWhiteSpace() -> Bool {

        // check if there's a range for a whitespace
        let range = self.rangeOfCharacter(from: .whitespacesAndNewlines)

        // returns false when there's no range for whitespace
        if let _ = range {
            return true
        } else {
            return false
        }
    }
}

Upvotes: 1

Joel
Joel

Reputation: 367

This answer works with text fields. I was going crazy trying to search for whitespace on a UItextfield without searching the string content of it. This works for UItextfields:

Swift 4:

    if (textField.text?.contains(" "))!{
        print("Has space")
    }else{
        print("Does not have space")
    }

This is for a regular string, also in swift 4

    if string.contains(" "){
        print("Has space")
    }else{
        print("Does not have space")
    }

Upvotes: 3

Rick Pasveer
Rick Pasveer

Reputation: 720

Shorter extension (swift 4.1)

extension String {
    var containsWhitespace : Bool {
        return(self.rangeOfCharacter(from: .whitespacesAndNewlines) != nil)
    }
}

You can change the .whitespacesAndNewlines with any other CharacterSet like this:

extension String {
    var containsDigits : Bool {
        return(self.rangeOfCharacter(from: CharacterSet.decimalDigits) != nil)
    }
}

Upvotes: 12

zaph
zaph

Reputation: 112857

Use NSCharacter on the entire string,not character-by-character:

let whitespace = NSCharacterSet.whitespaceCharacterSet()

let phrase = "Test case"
let range = phrase.rangeOfCharacterFromSet(whitespace)

// range will be nil if no whitespace is found
if let test = range {
    println("whitespace found")
}
else {
    println("whitespace not found")
}

Output:

whitespace found

Upvotes: 36

Related Questions