Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3 - Reduce a collection of objects by an Int property

Tags:

swift

reduce

I have an array containing 3 objects like so:

class AClass {
    var distance: Int?
}

let obj0 = AClass()
obj0.distance = 0

let obj1 = AClass()
obj1.distance = 1

let obj2 = AClass()
obj2.distance = 2

let arr = [obj0, obj1, obj2]

When I reduce the array and assign it to a variable, I can only sum the last element in the array.

let total = arr.reduce(0, {$1.distance! + $1.distance!})  //returns 4

If I try $0.distance! it errors with "expression is ambiguous without more context".

I tried being more explicit:

var total = arr.reduce(0, {(first: AClass, second: AClass) -> Int in
    return first.distance! + second.distance!
})

But this errors with "'Int' is incompatible with contextual type '_'" How do I reduce it to the sum of the distances?

like image 961
MikePrep Avatar asked Jun 04 '17 20:06

MikePrep


1 Answers

var total = arr.reduce(0, {$0 + $1.distance!})

The first argument is the accumulator, it is already an integer.

Note that this will crash on elements without distance. You could fix that e.g. using:

let total = arr.reduce(0, {$0 + ($1.distance ?? 0)})

or

let total = arr.compactMap { $0.distance }.reduce(0, +)
like image 143
Sulthan Avatar answered Sep 20 '22 00:09

Sulthan