11

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?

Leo Dabus
  • 229,809
  • 59
  • 489
  • 571
MikePrep
  • 157
  • 1
  • 6

1 Answers1

26
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, +)
Sulthan
  • 128,090
  • 22
  • 218
  • 270
  • 1
    `arr.flatMap` creates an intermediate array (which can be avoided with `arr.lazy.flatMap`), so the other solution might be preferable in this case. – Martin R Jun 04 '17 at 20:50