使用reduce从类中组合int

时间:2018-04-25 18:05:37

标签: swift

我看了这里:Swift 3 - Reduce a collection of objects by an Int property并且在这里:https://medium.com/@abhimuralidharan/higher-order-functions-in-swift-filter-map-reduce-flatmap-1837646a63e8但我无法减少工作。编辑:也许是因为他们改变了代码在swift 4中编译的方式(我正在使用)https://stackoverflow.com/a/46432554/7715250

这是因为我收到了这个错误:

  

上下文闭包类型'(_,Test) - > _”   需要2个参数,但在闭包体中使用了1个

这是我的班级:

class Test {
    let amountLeftToDownload: Int
    let amountDownloaded: Int

    init(amountLeftToDownload: Int, amountDownloaded: Int) {
        self.amountLeftToDownload = amountLeftToDownload
        self.amountDownloaded = amountDownloaded
    }
}

我有一个数组(进度)。我想获得下载的总数,即每个Test实例的amountLeftToDownload + amountDownloaded。我试过这个:

let totalDownloadsToProcess = progress.reduce(0) {$0.amountLeftToDownload, $0.amountDownloaded }

我将逗号替换为+,以及其他一些东西,但它不起作用。

1 个答案:

答案 0 :(得分:2)

传递给reduce的闭包有两个参数:第一个是累加器,第二个是要减少的数组中的元素。因此,您需要将当前记录中的值添加到当前总计中:

let totalDownloadsToProcess = progress.reduce(0) { $0 + $1.amountLeftToDownload + $1.amountDownloaded }

如果您为输入命名,可能会更清楚:

let totalDownloadsToProcess = progress.reduce(0) { totalSoFar, elem in totalSoFar + elem.amountLeftToDownload + elem.amountDownloaded }

为数组中的每个元素调用闭包。在每个步骤中,它返回一个新值,当处理下一个元素时,该值将作为totalSoFar传入。在处理第一个元素时,0用作totalSoFar的初始值。