Where usage in Swift

Where is a powerful keyword within Swift to easily filter out values. It can be used in many different variants from which most of them are listed in this post.

Usage in a switch

Consider having the following enum:

enum Action {
    case createUser(age: Int)
    case createPost
    case logout
}

Using where you can easily filter the case for a specific age range:

func printAction(action: Action) {
    switch action {
    case .createUser(let age) where age < 21:
        print("Young and wild!")
    case .createUser:
        print("Older and wise!")
    case .createPost:
        print("Creating a post")
    case .logout:
        print("Logout")
    }
}

printAction(action: Action.createUser(age: 18)) // Young and wild
printAction(action: Action.createUser(age: 25)) // Older and wise

Usage in a for loop

Printing even numbers using a for-loop.

let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in numbers where number % 2 == 0 {
    print(number) // 0, 2, 4, 6, 8, 10
}

Usage in protocol extensions

Extending an Array type based on its element.

extension Array where Element == Int {
    func printAverageAge() {
        let total = reduce(0, +)
        let average = total / count
        print("Average age is \(average)")
    }
}

let ages = [20, 26, 40, 60, 84]
ages.printAverageAge() // Average age is 46

Usage in first

Get a first element based on a condition.

let names = ["Henk", "John", "Jack"]
let firstJname = names.first(where: { (name) -> Bool in
    return name.first == "J"
}) // Returns John

Usage in contains

Determine if an array contains a condition matching element.

let fruits = ["Banana", "Apple", "Kiwi"]
let containsBanana = fruits.contains(where: { (fruit) in
    return fruit == "Banana"
}) // Returns true

Usage in initialisers

Conditional initialisers to only allow for certain types.

extension String {
    init(collection: T) where T.Element == String {
        self = collection.joined(separator: ",")
    }
}

let clubs = String(collection: ["AJAX", "Barcelona", "PSG"])
print(clubs) // prints "AJAX, Barcelona, PSG"
Collect by WeTransfer Collect by WeTransfer is the best way to organize your ideas. Save content from across your apps and bring it together for your friends, your team, or just for yourself.