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 ๆ‰ๆฏ”่ผƒไธ€่‡ดใ€‚

This method is preferred over reduce(_:_:) for efficiency when the result is a copy-on-write type, for example an Array or a Dictionary.

๐Ÿ‘‰ .reduce(into:_:)

๐Ÿ‘‰ stackoverflow

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