seq.reduce(into:_:)
// declaration
func reduce<Result>(
into initialResult: Result,
_ updateAccumulatingResult: (
_ partialResult: inout Result, // ⭐️ inout parameter
Self.Element
) throws -> () // ⭐️ no return value
) rethrows -> Result

使用此方法時,一定要在 updateAccumulatingResult 這個 closure 的 function body 裡面更新 partialResult 這個 inout 參數,reduce(into:_:) 就是透過更新此參數,最後再將此參數的累積更新總結果 (accumulating result) 當成 return value 傳回。這也是為什麼這個 closure 稱為 updateAccumulatingResult 了,因為你必須在它的 body 裡面 "update" accumulating result (partialResult)。👉 比較:seq.reduce(_:_:)
註:我認為 Apple 在這個方法的參數名稱上,有「命名不一致」的問題。既然 closure 稱為 updateAccumulatingResult,那麼 partialResult 這個 inout 參數就應該命名為 accumulatingResult 才比較一致。
let numbers = [1, 1, 2, 2, 2, 3, 4, 4, 5, 4, 3]
// ⭐️ filter adjacent equal entries: [1, 2, 3, 4, 5, 4, 3]
// ╭──1──╮ ╭─2──╮
let filtered = numbers.reduce(into: [Int]()) { result, n in
if n != result.last { result.append(n) }
// ╰───── 3 ──────╯
}
// ⭐️ 1. intial result: empty array
// ⭐️ 2. accumulating result (inout parameter)
// ⭐️ 3. update accumulating result in closure body
Last updated
Was this helpful?