发布网友 发布时间:2022-12-26 08:17
共1个回答
热心网友 时间:2023-10-15 04:55
来看一个例子,就能秒懂
在本例中,首先使用 map 转换数组中的名称
转换为小写字符串,然后计算它们的字符数。
相同点:
map 和 flatMap 都可以用在 Optionals 和 SequenceTypes 上(如:数组、字典等)。
不同点:
map 对这个序列的每个元素进行转换。
flatMap 会将转换( transform )函数的返回类型先拍扁,在组合成本身的复合类型
看一个例子
请注意上面使用 map 和 flatMap ,带有返回数组的转换的结果。实际上 s.flatMap(transform) 相当于 Array(s.map(transform). joined()) 。
Swift4.1 新加入的新特性 compactMap ;
对序列的每个元素进行转换,返回非nil结果
看一个例子
map 返回有可选值 nil
compactMap 返回的是剔除可选值的结果
当类型转换时有可能装换为可选类型的时候,用 compactMap ,不会装换为可选类型的咱们直接用 flatMap
比如我们有一个数组
我们想要返回每个元素的长度的时候,转换时返回类型是 Int? 时,这个时候不能确保转换成功,就需要用 compactMap
filter 过滤器,可以取出数组中符合条件的元素,重新组成一个新的数组
有的时候我们需要把所有元素的值合并成成一个新的值,就用到了 rece
来看下面这个例子
当调用 numbers.rece(_:_:) 时,执行以下步骤:
1。使用 initialResult —— 0 调用 nextPartialResult 闭包,在这种情况下——调用 numbers 的第一个元素,返回 sum:' 1 ' 。
2。使用前一个调用的返回重复调用闭包值和序列的每个元素。
3。当序列用完时,从闭包返回给调用者。
如果序列没有元素,则永远不会执行 nextPartialResult 和 initialResult 是调用 rece(_:_:) 的结果。
1. 合并成的新值不一定跟原数组中元素的类型相同
2. ruce 还可以实现 map 和 filter 并且时间复杂度变为 O(n) 原来 map 和 filter 的时间复杂度是 O(n*n)
我们看 SequenceTypes 上的方法和函数有这么多,学无止境,慢慢探索