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

Posted

技术标签:

【中文标题】你如何在 swift 中使用 reduce(into:)【英文标题】:How do you use reduce(into:) in swift 【发布时间】:2020-09-18 01:37:44 【问题描述】:

我正在阅读 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 在我们开始时是[[],[]],并且每次循环都会改变,因为我们附加到内部数组之一。最后分配给result 如果你真的想“知道每个变量/标签在循环中代表什么以及值如何变化”,请在纸上一步一步或使用调试器并观察变量变化。 @matt 和@MassimilianoBartolini 书不是在这之前介绍过闭包语法吗?如果是这样,您应该知道 ... 是一个闭包,temp 是它的参数之一。 @Sweeper 当然。如果我们假设了解此页面之前的所有页面,则毫无疑问。就好像 OP 跳过了整本书并跳到了这一点(然后阅读了代码,但没有阅读描述它的文字)。 【参考方案1】:

在闭包内部,“temp”是结果格式,即 [[][]],“i”是每个数字。正如您所说,它会循环处理所有数字。当使用 % 时,它返回除法余数,因此对于像“1,3,5”这样的奇数,它返回“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]]

根据文档,闭包是按顺序调用的,可变的累积值已初始化,当用尽时,会返回给调用者。

【讨论】:

以上是关于你如何在 swift 中使用 reduce(into:)的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用 map/reduce/flatmap 将数组字典减少为相同类型的单个数组

Swift高阶函数:Map,Filter,Reduce

Swift map filter reduce 使用指南

Swift基础知识碎片

Swift基础知识碎片

Swift:你如何使用 UIPanGestureRecognizer 获得每次触摸的速度?