How to count specific elements in an array in swift
A fast, compact and elegant way to do it with the method reduce
:
let count = OSes.reduce(0) { $1 == "Android" ? $0 + 1 : $0 }
It's more compact than a loop for
and faster than a loop filter
because it doesn't generate a new array.
The method reduce
takes an initial value, 0 in our case, and a closure applied to each element in the array.
The closure has 2 parameters:
- the value at the previous iteration (or the initial value, 0 in our case)
- array element for the current iteration
The value returned by the closure is used as the first parameter in the next iteration, or as the return value of the method reduce
when the last element has been processed
The closure just checks if the current element is Android
:
- if not, it returns the aggregated value (the first parameter passed to the closure)
- if yes it returns that number plus one
source to share
Swift 5 with score (where :)
let countOfAndroid = OSes.count(where: { $0 == "Android" })
Swift 4 or less with filter (_ :)
let countOfAndroid = OSes.filter({ $0 == "Android" }).count
source to share