如数组和字典 forEach(_:)实例方法中所述:
forEach(_:)
以与for-in循环相同的顺序在 序列 中的每个元素上调用给定的闭包。
尽管如此,改编自序列概述:
序列是您可以一次浏览一个值的列表。遍历序列元素 的最常见方法 是使用 for-in循环 。
forEach(_:)或表示该迭代序列for in:
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循环有什么好处?从性能角度来看,它们是相同的吗?
作为一个假设,它可能是语法糖,特别是在使用 函数式编程时 。
没有提供任何性能上的好处forEach。实际上,如果您查看源代码,该forEach函数实际上只是执行for- in。对于发行版,此功能相对于简单使用的性能开销for- in自己并不重要,尽管对于调试版,这会导致明显的性能影响。
forEach
for
in
的主要优势forEach时,你正在做的函数式编程实现,你可以把它添加到的功能调用链,而无需事先结果保存到一个单独的变量,如果你使用你需要for- in语法。因此,代替:
let objects = array.map { ... } .filter { ... } for object in objects { ... }
您可以改为使用功能性编程模式:
array.map { ... } .filter { ... } .forEach { ... }
结果是功能代码更简洁,语法噪音更少。
FWIW,Array,Dictionary和Sequence的文档都使我们想起了引入的限制forEach,即:
您不能使用break或continue语句退出body关闭的当前调用或跳过后续调用。 return在body闭包中使用该语句将仅从当前对的调用退出body,而不从任何外部范围退出,并且不会跳过后续调用。
您不能使用break或continue语句退出body关闭的当前调用或跳过后续调用。
break
continue
body
return在body闭包中使用该语句将仅从当前对的调用退出body,而不从任何外部范围退出,并且不会跳过后续调用。
return