Reputation: 512
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
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
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
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
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
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
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
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