Swift 3 - 通过整数属性缩减对象集合

11

我有一个包含3个对象的数组,就像这样:

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]
当我将数组缩小并将其赋值给一个变量时,我只能对数组中的最后一个元素求和。
let total = arr.reduce(0, {$1.distance! + $1.distance!})  //returns 4
如果我尝试 $0.distance!,它会出现“expression is ambiguous without more context”的错误提示。
我尝试更加明确:
var total = arr.reduce(0, {(first: AClass, second: AClass) -> Int in
    return first.distance! + second.distance!
})

但是这个错误是 "'Int' is incompatible with contextual type '_'"

我该如何将它缩减到距离的总和?

1个回答

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

第一个参数是累加器,它已经是一个整数。

请注意,此代码将在没有距离的元素上崩溃。您可以使用下面的方法解决这个问题:

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

1
arr.flatMap 会创建一个中间数组(可以使用 arr.lazy.flatMap 避免),因此在这种情况下,另一种解决方案可能更可取。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接