January 8th, 2018
Filed under: iOS Development, Mac Development | Be the first to comment!
The reduce
function takes all the elements of a collection and combines them into a single value. Supply an initial value and a function or closure (unnamed function) to combine the elements.
The following code demonstrates how to calculate the average for a collection of test scores:
let testScores = [78, 96, 48, 65, 59, 91]
let average = testScores.reduce(0.0, { x, y in
Double(x) + Double(y)
}) / Double(testScores.count)
The closure inside the call to reduce
calculates the sum of the test scores. Divide the sum by the number of scores to calculate the average. I had to convert the scores and the array count to floating-point values to calculate the average accurately. Swift does not let you divide two integers and return a floating-point value. Dividing two integers yields an integer, which you can test in a playground with the following code:
let integerAverage = testScores.reduce(0, { x, y in
x + y
}) / testScores.count
Dividing the two integers yields an average of 72
instead of 72.833333
.
My code example demonstrates the syntax for using reduce
with closures, but the code could be cleaner. A cleaner way to calculate the average is to use reduce
to calculate the sum and do the floating-point conversion when dividing.
let sum = testScores.reduce(0, +)
let average = Double(sum) / Double(testScores.count)
The code to call reduce
is simpler in this version because there’s no closure to write.
Tags: functional programming, swift