reduce() vs. reduce(into:)

`reduce(_:_:)``reduce(into:_:)`

  • 參數不同: reduce(into:_:)inout parameterreduce(_:_:)沒有,所以當它將之前累積的結果傳入 nextPartialResult 並需要更新新的累積結果時,就必須複製 (copy-on-write) 之前的結果,所以如果 Result 是一個大型的 ArrayDictionary 之類的型別,就會對程式的效率產生衝擊

  • 回傳方式不同:

    reduce(_:_:) 是將 nextPartialResult 最後的 return value 作為整個方法的回傳值reduce(into:_:) 則是用 updateAccumulatingResult 持續對 partialResult更新,然後以 partialResult 最後的值作為回傳值

// `reduce(_:_:)`
func reduce<Result>(
    _ initialResult    : Result, 
    // ⭐️ combine function (with return value)
    _ nextPartialResult: (Result, Element) throws -> Result
) rethrows -> Result

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

Example

我們用合併 SwiftUI 中的 transitions 來舉例,說明這兩者的用法有哪些不同。在合併 SwiftUI 中的 transitions 時,使用 SwiftUI 原有的語法,顯得太過冗長:

若使用 .reduce() 或 .reduce(into:),則可以將語法變為更精簡:

前提是要先加入以下的 extension:

至於用 .reduce() 還是 .reduce(into:)?它們之間有何不同,請看下面的程式碼:

.reduce()

.reduce(into:)

Last updated

Was this helpful?