当前位置: 首页 > 面试题库 >

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

傅英喆
2023-03-14
问题内容

数组和字典
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循环有什么好处?从性能角度来看,它们是相同的吗?

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


问题答案:

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

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

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

for object in objects {
    ...
}

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

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

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

FWIW,Array,Dictionary和Sequence的文档都使我们想起了引入的限制forEach,即:

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

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



 类似资料:
  • 问题内容: Android有自己的HashMap实现,它不使用自动装箱,并且在某种程度上可以提高性能(CPU或RAM)? https://developer.android.com/reference/android/support/v4/util/ArrayMap.html 从我在这里所读的内容中,如果我的HashMaps的大小低于数百条记录并且将被频繁写入,则应将我的HashMap对象替换为A

  • 问题内容: 代替在所有地方使用是否合法?为什么从Python 3中删除?似乎是一种了不起的,有用的方法。它背后的原因是什么? 编辑: 为澄清起见,我想知道以类似于生成器的方式(一次将一项,而不是全部都存储到内存中)以与Python 2和Python 3兼容的方式遍历字典的正确习惯是什么。 ? 问题答案: 在Python 2.x中-返回(键,值)对的列表。在Python 3.x中,现在是一个对象,其

  • 问题内容: 有人可以为我阐明使用MySQLi代替MySQL的优点和缺点吗?在某些情况下我不应该使用MySQLi?为了使用MySQLi,是否需要对服务器进行其他配置?例如,是否需要升级Apache或PHP以支持MySQLi? 问题答案: 为什么应使用MySQLi扩展而不是MySQL扩展的原因很多: MySQLi为您提供准备好的语句-一种将数据发送到MySQL并保护您免受SQL注入的安全方法。 仅此一

  • 问题内容: 似乎PHP有两个名为memcache和memcached的 memcached库。有什么区别,您怎么知道要使用哪一个?是一个过时了吗?看来memcached提供了更多的方法,所以我认为这意味着它已经有了最多的开发-但它似乎也需要外部C / C ++库,因此我不确定是否可以安装它。 似乎memcache已经存在了很长时间,不需要其他库,甚至为Windows 预编译了二进制文件!我认为这将

  • 问题内容: 什么时候用Java thread.run()代替thread.start()? 问题答案: 你可能要在特定于功能而不是并发的特定单元测试中调用run()。

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制