Есть два похожих reduce
метода: В
func reduce<Result>(into initialResult: Result, _ updateAccumulatingResult: (inout Result, Element) throws -> ()) rethrows -> Result
замыкание обновляет аккумулятор, но не возвращает значение, тогда как в
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
закрытие возвращает обновленное накопленное значение.
В вашем случае это должно быть
taken = basket.reduce(into: 0) { (initial, bi) in
// Update accumulated value:
initial += bi.amount() - bi.discount()
}
с использованием первой версии или
taken = basket.reduce(0) { (initial, bi) in
// Compute and return accumulated value:
return initial + bi.amount() - bi.discount()
}
с использованием второй версии.