本文基于Swift5,阅读时间大约需要10min。

简介

Swift摒弃了C语言式定义变量、累加变量的for-loop,用for-in取而代之,来遍历集合类型。

那什么是forEach(_:)呢?forEach(_:)也是一种遍历方式。虽然都是遍历方式,但是两者还是有些许的不同的。下面让我们来全面了解一下两者。

应用场景

for-in

  • 不需要使用索引,只是单纯的遍历集合
let strs = ["first", "second", "third"]
for str in strs {print(str)
}//first second third
复制代码
  • 需要使用索引
for (index, str) in strs.enumerated() {print(index, str)
}
// 0 first
// 1 second
// 2 third
复制代码

forEach(_:)

  • 函数式编程
var arr = ["1", "2", "3"]
arr.map {Int($0)!}.forEach { (num) inprint(num)
}
// 1 2 3//假如不使用forEach
let map = arr.map {Int($0)!}
for num in map {print(num)
}
复制代码
  • 遍历optional的集合类型
// 如果使用for-in强制解包的话会crash
var optionalStrs:[String]? = nil
for str in optionalStrs! {print(str)
}//使用forEach比较便捷,不会crash
var optionalStrs:[String]? = nil
optionalStrs?.forEach({ (str) inprint(str)
})
复制代码

区别

  • forEach(_:)是不能使用breakcontinue来退出当前循环的。
  • 在使用return语句的时候,只是退出当前闭包,并不会影响外部的代码块,也不会影响后面循环的调用。
func foreachTextFunc() {let strs = ["first", "second", "third"]strs.forEach { (str) inprint(str)return;print("foreach body")}print("end")
}foreachTextFunc()
//first
//second
//third
//end
复制代码

通过上面的代码我们可以看出,在forEach(_:)添加了return;之后,它仅仅跳过执行print("foreach body"),后面的循环调用和最后的print("end")语句都没有被跳过。

Note

如果将上面的return;写成return,它还是会执行print("foreach body"),具体原因请点击这里

总结

  • 两者的执行顺序是一致的,执行性能没有差别。
  • 当需要使用breakcontinuereturn等控制语句的时候使用for-in
  • 当遍历optional数组的时候,使用forEach(_:)更加安全方便。
  • 当使用函数式编程的时候,使用forEach(_:)

OK,到这里关于forEach(_:)for-in就介绍完了,相信大家都对两者的区别和使用场景都有了清晰地认识。接下来大家可以在项目里尽情的使用它们啦,Enjoy It。

Plus:
如果大家觉得本文对大家有一丝帮助,希望大家点个?。
如果有任何问题可以在评论区留言
复制代码

参考

  • developer.apple.com/documentati…
  • stackoverflow.com/questions/4…

关于Swift中的forEach(_:)和for-in loop相关推荐

  1. swift视图容器_如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图...

    swift视图容器 by Lee Dowthwaite 通过李道思韦特 如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图 (How to create a beautif ...

  2. swift建立桥接_在Swift中建立Alexa技能

    swift建立桥接 by Claus Höfele 通过克劳斯·霍费尔 在Swift中建立Alexa技能 (Building Alexa Skills in Swift) 如何使用Swift开发Ama ...

  3. swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用

    浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...

  4. swift中_的用法,忽略默认参数名。

    swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...

  5. Swift 中 _ 和 !和 ? 分别是什么东西呢?

    ####1.在swift中有么一个"_"符号,具体例子如下. func greet(_ person: String, on day: String) -> String { ...

  6. Swift实战问题之Swift 中的下划线_是什么意思?

    实战问题 Swift 中的下划线_是什么意思?例如下面的函数参数 for _ in 1-5 { print("hello") } if let _ = optionalValue ...

  7. swift设置启动图不现实_如何通过装饰房屋来开始在Swift中使用增强现实

    swift设置启动图不现实 by Ranadhir Dey 由Ranadhir Dey 如何通过装饰房屋来开始在Swift中使用增强现实 (How to get started with augmen ...

  8. 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们

    浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...

  9. 解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题

    swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer li ...

最新文章

  1. 巧用rsyslog收集多套日志并做单套日志的过滤分离
  2. Flutter ------- WebView加载网页
  3. [发布]Quartz.NET 示例程序:企业调度器 V0.2 源代码
  4. CentOS命令行安装配置KVM详细教程
  5. json字符串转换成json对象
  6. 利用XMLSerializer将对象串行化到XML
  7. JavaFX 新WebService客户端脚本语言
  8. WPF 虚拟化 VirtualizingWrapPanel 和 VirtualLizingTilePanel
  9. java 中subtract的用法_java中BigDecimal加减乘除基本用法
  10. deepin系统15.6版本安装执行那个exe文件_深度系统(Deepin Linux)U盘安装教程
  11. 《高翔视觉slam十四讲》学习笔记 第六讲 非线性优化
  12. mysql 元数据修改_MySQL 元数据
  13. 串口485接法图_RS232转换为RS485的接线方法最好有图
  14. Apktool命令使用总结
  15. Postman的下载及安装
  16. 微型计算机电路试卷,微机原理试卷及答案2
  17. PyQt5 QPushButton 设置文字对齐方式(基于setStyleSheet)
  18. CentOS7 python gi模块安装
  19. 3D点集之间计算转移矩阵,旋转R,转移T,新增缩放s (总结全面)
  20. HDU2066-一个人的旅行

热门文章

  1. xmlhttp的状态码收集
  2. 记一次Spring Batch完整入门实践
  3. 【心得】centos 去除屏幕保护
  4. Linux Watchdog Test Program
  5. Myeclipse 操作技巧
  6. 选择FreeBSD的理由?欢迎新人观看^_^
  7. 【CCNA Exploration 4.0 路由协议和概念3】
  8. Vmware VirtualCenter Server服务无法自动启动
  9. android 模拟器 3D 开发环境配置
  10. Android xml文件的序列化