2017-06-04 75 views
3

我有一个包含3个对象,像这样的数组:夫特3 - 由一个Int属性减少对象的集合

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!它与“表达不明确,没有更多上下文”的错误。

我试图更加明确:

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

但这个错误与“‘诚信’是上下文类型‘_’不兼容” 如何将其降低到距离的总和?

回答

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

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

请注意,这将在没有距离的元素上崩溃。你可以修复,例如使用:

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

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

'arr.flatMap'创建一个中间阵列(其可与'arr.lazy.flatMap'避免),所以其他解决方案可能是在这种情况下,优选。 –