关于Swift中的forEach(_:)和for-in loop
本文基于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(_:)
是不能使用break
和continue
来退出当前循环的。 - 在使用
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")
,具体原因请点击这里
总结
- 两者的执行顺序是一致的,执行性能没有差别。
- 当需要使用
break
、continue
、return
等控制语句的时候使用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相关推荐
- swift视图容器_如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图...
swift视图容器 by Lee Dowthwaite 通过李道思韦特 如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图 (How to create a beautif ...
- swift建立桥接_在Swift中建立Alexa技能
swift建立桥接 by Claus Höfele 通过克劳斯·霍费尔 在Swift中建立Alexa技能 (Building Alexa Skills in Swift) 如何使用Swift开发Ama ...
- swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用
浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...
- swift中_的用法,忽略默认参数名。
swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...
- Swift 中 _ 和 !和 ? 分别是什么东西呢?
####1.在swift中有么一个"_"符号,具体例子如下. func greet(_ person: String, on day: String) -> String { ...
- Swift实战问题之Swift 中的下划线_是什么意思?
实战问题 Swift 中的下划线_是什么意思?例如下面的函数参数 for _ in 1-5 { print("hello") } if let _ = optionalValue ...
- swift设置启动图不现实_如何通过装饰房屋来开始在Swift中使用增强现实
swift设置启动图不现实 by Ranadhir Dey 由Ranadhir Dey 如何通过装饰房屋来开始在Swift中使用增强现实 (How to get started with augmen ...
- 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们
浅层学习与深层学习 by Payal Gupta 通过Payal Gupta 深层副本与浅层副本-以及如何在Swift中使用它们 (Deep copy vs. shallow copy - and h ...
- 解决Swift中present(uiImagePickerController,animated: true,completion: nil)闪退的问题
swift中开发选择图片上传,会使用到Tap Gesture Recognizer控件,对应 UITapGestureRecognizer API,以下是代码示例(取自IOS developer li ...
最新文章
- 巧用rsyslog收集多套日志并做单套日志的过滤分离
- Flutter ------- WebView加载网页
- [发布]Quartz.NET 示例程序:企业调度器 V0.2 源代码
- CentOS命令行安装配置KVM详细教程
- json字符串转换成json对象
- 利用XMLSerializer将对象串行化到XML
- JavaFX 新WebService客户端脚本语言
- WPF 虚拟化 VirtualizingWrapPanel 和 VirtualLizingTilePanel
- java 中subtract的用法_java中BigDecimal加减乘除基本用法
- deepin系统15.6版本安装执行那个exe文件_深度系统(Deepin Linux)U盘安装教程
- 《高翔视觉slam十四讲》学习笔记 第六讲 非线性优化
- mysql 元数据修改_MySQL 元数据
- 串口485接法图_RS232转换为RS485的接线方法最好有图
- Apktool命令使用总结
- Postman的下载及安装
- 微型计算机电路试卷,微机原理试卷及答案2
- PyQt5 QPushButton 设置文字对齐方式(基于setStyleSheet)
- CentOS7 python gi模块安装
- 3D点集之间计算转移矩阵,旋转R,转移T,新增缩放s (总结全面)
- HDU2066-一个人的旅行