Daisy R.
Daisy R.

Reputation: 633

Checking for whitespace in a string typed array - Swift

In a string typed array how can I achieve the functionality as I would for checking whitespace in a string? I'd like to check if the array contains only whitespace

 var stringExample: String!
 var stringArrayExample: [String]!

 if stringExample.trimmingCharacters(in: .whitespaces).isEmpty{
 //string contains whitespace characters
 } 

Upvotes: 1

Views: 1517

Answers (2)

fguchelaar
fguchelaar

Reputation: 4909

I've created an extension for String which returns whether it's empty or contains only whitespace:

extension String {
    var isEmptyOrWhitespace : Bool {
        return self.trimmingCharacters(in: .whitespaces).isEmpty
    }
}

And since I'm also a .NET developer and like the methods Any, All etc. I've also created an extension for the Array type, which lets me check a condition for every element in the array, leveraging the reduce function:

extension Array {
    func all(test: (Element) -> Bool) -> Bool {
        return self.reduce(true) { $0 && test($1) }
    }
}

Then you can combine these two to get a fairly nice syntax, which is also fairly performant, since it "breaks" when it stumbles upon an element that does not comply with the provided test (using a for instead of reduce would probably be even more efficient).

let strings1 = ["   ", "", "\t"]
print(strings1.all { $0.isEmptyOrWhitespace })  // true
print(strings1.all { !$0.isEmptyOrWhitespace }) // false

By printing within the test, you can see it no longer executes the tests for elements when it finds the first non-compliant one.

let strings2 = ["   ", "x", "\t"]
print(strings2.all(test: { (str) -> Bool in
    let e = str.isEmptyOrWhitespace
    print ("[\(str)]: \(e)")
    return e
}))

Prints:

[   ]: true
[x]: false
false

Upvotes: 0

Ben Lachman
Ben Lachman

Reputation: 3100

Swift 3 would look something like this if I'm understanding what you're wanting:

var someStrings = ["   ", "foo", "bar", "\t"]

let result = someStrings.filter { $0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty }

print(result) // ["   ", "\t"]

If you're just wanting to know if the array of strings are all whitespace-only strings you could change the last two lines to:

let result = someStrings.filter { $0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false }

print(result.isEmpty) // false

Note that both these use .whitespacesAndNewlines if you don't want new lines, just use .whitespaces like you do in your original example.

Upvotes: 2

Related Questions