本文基于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) in
print(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) in
print(str)
})
区别
- 在
forEach(_:)是不能使用break和continue来退出当前循环的。 - 在使用
return语句的时候,只是退出当前闭包,并不会影响外部的代码块,也不会影响后面循环的调用。
func foreachTextFunc() {
let strs = ["first", "second", "third"]
strs.forEach { (str) in
print(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:
如果大家觉得本文对大家有一丝帮助,希望大家点个👍。
如果有任何问题可以在评论区留言