ios - 你如何在 swift 中使用 reduce(into:)
问题描述
我正在使用 Swift 阅读 iOS 13 Programming Fundamentals,谈到了关于 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”是每个数字。正如您所说,它会循环处理所有数字。当使用 % 时,它返回除法余数,因此对于像“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]]
根据文档,闭包被顺序调用,可变的累积值初始化,当用尽时,返回给调用者。
推荐阅读
- video - 如何基于 Azure 文本转语音将 Visimes ID 与我的 svg 图像框架文件夹连接
- java - 为什么我得到 Java.lang.IllegalArgumentException:使用反射创建带有私有构造函数的新实例时参数数量错误
- python-3.x - 如何在深度嵌套字典中出现所选键的任何位置删除键:值对?
- python - Python中的秘密存储
- google-cloud-platform - 谷歌云平台使用API发送配额增加请求
- python-3.x - 加入两个字典并按不同键对它们进行分组并总结值的最有效方法
- javascript - 为什么 js 文件在我的烧瓶应用程序中不起作用?
- python - 如何在 Django 模型中创建一个字段,将特定字符串连接到每个记录的 id?
- php - Laravel:尝试获取 PDF 时出现 DOMPDF 错误
- filter - safari 14 图像-webkit-filter 不起作用