我看了这里: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 }
我将逗号替换为+,以及其他一些东西,但它不起作用。
答案 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
的初始值。