關於Swift中的forEach(_:)和for-in loop

本文基於Swift5,閱讀時間大約須要10min。編程

簡介

Swift摒棄了C語言式定義變量、累加變量的for-loop,用for-in取而代之,來遍歷集合類型。swift

那什麼是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(_:)是不能使用breakcontinue來退出當前循環的。
  • 在使用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"),具體緣由請點擊這裏bash

總結

  • 二者的執行順序是一致的,執行性能沒有差異。
  • 當須要使用breakcontinuereturn等控制語句的時候使用for-in
  • 當遍歷optional數組的時候,使用forEach(_:)更加安全方便。
  • 當使用函數式編程的時候,使用forEach(_:)

OK,到這裏關於forEach(_:)for-in就介紹完了,相信你們都對二者的區別和使用場景都有了清晰地認識。接下來你們能夠在項目裏盡情的使用它們啦,Enjoy It。閉包

Plus:
若是你們以爲本文對你們有一絲幫助,但願你們點個👍。
若是有任何問題能夠在評論區留言
複製代碼

參考

相關文章
相關標籤/搜索