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:
Observability that's custom-built for mobileDespite our best efforts, sometimes issues slip through the cracks. That's why having an amazing observability tool in your corner is important to keep your app humming. bitdrift gives you on-demand observability that's custom-built for mobile teams: no log limits, no overage fees, and no waiting on your next app release. Learn more.
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
Observability that's custom-built for mobileDespite our best efforts, sometimes issues slip through the cracks. That's why having an amazing observability tool in your corner is important to keep your app humming. bitdrift gives you on-demand observability that's custom-built for mobile teams: no log limits, no overage fees, and no waiting on your next app release. Learn more.
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"