ArrayDictionary forEach(_:)实例方法所述:

在同一个数组中对sequence中的每个元素调用给定的闭包

然而,改编自Sequence Overview:

序列是一系列的值,你可以一步一步地通过它们

这意味着以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(_:)人?i、 e使用它而不是for in循环有什么好处?从性能的Angular 来看,它们是否相同?

作为一种假设,它可能是一种语法糖分,尤其是在使用functional programming时.

推荐答案

forEach没有提供任何性能优势.实际上,if you look at the source codeforEach函数实际上只是执行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语句退出当前

  2. body闭包中使用return语句只能从

Swift相关问答推荐

使SCNode透明,以便您通过它查看其他 node

具有@Published属性的双向数据流动,能够忽略事件

防止NavigationLink自行返回导航视图

对多个项目的数组进行排序

动画过程中的SwiftUI重绘视图

在visionOS 1.0中已弃用';base Color';:请改用`Color`属性

如何强制创建新的UIViewControllerRenatable|更新Make UIViewController上的视图

在 SwiftUI 视图中观察 UIViewRepresentable 的 @State var 变化

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

使用UICollectionViewFlowLayout创建水平的UICollectionView,并同时将单元格对齐到左边和右边的能力

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

使用 RxSwift 围绕 async/await 方法创建 Observable

与 SwiftUI 中的 onChange 修饰符相比,objectWillChangeSequence 的目的是什么?

Swift UI 不重绘 NSViewRepresentable 包装的文本字段

Reality Composer Tap Trigger 问题

Swift:连接两个数组而不重复共享后缀/前缀

Swift 2 或 3 中的 Google Analytics 问题

使用 swift 运行 pod install 时出错

使用 Swift 以编程方式自定义 UITableViewCell

应用程序包不包含有效标识符