一尘不染

什么时候使用forEach(_ :)代替for in?

swift

数组字典
forEach(_:)实例方法中所述:

以与for-in循环相同的顺序在 序列 中的每个元素上调用给定的闭包。

尽管如此,改编自序列概述

序列是您可以一次浏览一个值的列表。遍历序列元素 的最常见方法 是使用 for-in循环

forEach(_:)或表示该迭代序列for in

let closedRange = 1...3

for element in closedRange { print(element) } // 1 2 3

closedRange.forEach { print($0) } // 1 2 3

或(数组):

let array = [1, 2, 3]

for element in array { print(element) } // 1 2 3

array.forEach { print($0) } // 1 2 3

将给出相同的输出。

为什么forEach(_:)还要存在?即使用它而不是for in循环有什么好处?从性能角度来看,它们是相同的吗?

作为一个假设,它可能是语法糖,特别是在使用 函数式编程时


阅读 374

收藏
2020-07-07

共1个答案

一尘不染

没有提供任何性能上的好处forEach。实际上,如果您查看源代码,该forEach函数实际上只是执行for-
in。对于发行版,此功能相对于简单使用的性能开销for- in自己并不重要,尽管对于调试版,这会导致明显的性能影响。

的主要优势forEach时,你正在做的函数式编程实现,你可以把它添加到的功能调用链,而无需事先结果保存到一个单独的变量,如果你使用你需要for-
in语法。因此,代替:

let objects = array.map { ... }
    .filter { ... }

for object in objects {
    ...
}

您可以改为使用功能性编程模式:

array.map { ... }
    .filter { ... }
    .forEach { ... }

结果是功能代码更简洁,语法噪音更少。

FWIW,ArrayDictionarySequence的文档都使我们想起了引入的限制forEach,即:

  1. 您不能使用breakcontinue语句退出body关闭的当前调用或跳过后续调用。

  2. returnbody闭包中使用该语句将仅从当前对的调用退出body,而不从任何外部范围退出,并且不会跳过后续调用。

2020-07-07