请求解析Swift中let initial: (T?, Int) = (.None, 0)语法含义
解释Swift泛型函数中的
let initial: (T?, Int) = (.None, 0) 咱们把这段代码拆成两部分拆解,就能轻松理解它的作用了:
1. 元组的类型声明:(T?, Int)
这是一个二元元组的类型定义,包含两个元素:
- 第一个元素的类型是
T?:T是函数的泛型参数(要求符合Comparable协议),?表示这是一个可选类型——它既可以存储T类型的具体值,也可以处于“空”状态。 - 第二个元素的类型是
Int:用来存储当前统计到的唯一元素数量。
2. 元组的初始化:(.None, 0)
这是给上面定义的元组赋值:
.None是Swift早期版本中表示可选类型“空值”的写法(现在已经统一用nil替代),这里第一个元素初始化为“无值”,对应还没开始遍历数组时,不存在“上一个元素”的状态。0是第二个元素的初始值,表示一开始还没统计到任何唯一元素。
结合reduce函数的作用理解
这个initial是数组reduce方法的初始累加器。reduce会遍历数组的每个元素,通过闭包不断更新累加器的状态:
- 闭包中的
$0代表当前的累加器(也就是之前的(上一个元素, 当前统计数)) $1代表当前遍历到的数组元素- 每次遍历会判断:如果上一个元素和当前元素相等,统计数不变;如果不相等,统计数加1,同时把当前元素作为新的“上一个元素”
- 最后
reduced.1就是累加器中存储的最终唯一元素数量
举个实际例子,比如数组是[1,1,2,3,3]:
- 初始累加器是
(nil, 0) - 遍历第一个元素
1:因为上一个元素是nil,统计数变成1,累加器变为(1,1) - 遍历第二个元素
1:和上一个元素相等,统计数不变,累加器还是(1,1) - 遍历第三个元素
2:和上一个元素不等,统计数变成2,累加器变为(2,2) - 以此类推,最后得到的统计数是3,也就是正确的唯一元素数量
内容的提问来源于stack exchange,提问作者Fred Shmed
相关产品推荐
相关产品推荐

