你如何在 swift 中使用 reduce(into:)

How do you use reduce(into:) in swift

我正在阅读 iOS 13 Programming Fundamentals with Swift,读到了关于 reduce() 的部分,我想我或多或少地理解了它,但是还有 reduce(into:)和这段代码:

let nums = [1,2,3,4,5]
let result = nums.reduce(into: [[],[]]) { temp, i in 
    temp[i%2].append(i)
}
// result is now [[2,4],[1,3,5]]

因此这段代码采用一个 Int 数组并将其拆分为 2 个数组,偶数和奇数。问题是我不知道括号 {} 内发生了什么。

在reduce的情况下,第一个参数是迭代的第一个参数,然后闭包应该一个接一个地处理所有项目,类似于map()但更强大(这里一个循环是足以获得这两个数组,但根据本书,使用 map() 我需要 2 个循环)。

无论如何我都无法理解这里的语法,尤其是 "temp" 代表什么以及 "in" 的用法。 "append()" 如何将值附加到正确的数组?

在闭包内部,"temp"是结果格式,即[[][]],"i"是每个数字。正如您所说,它循环处理所有数字。当使用 % 时,它 returns 除法余数,所以对于像“1,3,5”这样的奇数,它 returns “1”,对于偶数“0”,这意味着 "temp" 将这些值附加到这些相应索引中的数组。

因此,如果我们调试并替换常量变量,结果将是:

temp[1].append(1) //1%2 = 1/2 left 1 [[][1]]
temp[0].append(2) //2%2 = 2/2 left 0 [[2][1]]
temp[1].append(3) //3%2 = 3/2 = 1 left 1 [[2][1,3]]
temp[0].append(4) //4%2 = 4/2 left 0 [[2,4][1,3]]
temp[1].append(5) //5%2 = 5/2 = 2 left 1 [[2,4][1,3,5]]

根据文档,闭包是按顺序调用的,其中初始化了一个可变的累积值,当用完时,返回给调用者。