Swift中遍歷方法for in 和 forEach的區(qū)別

前言

在swift中溶诞,我們經(jīng)常會(huì)用到的兩種快速遍歷的方法灵疮,一種是最常見也是最常用的for ... in ..., 另外一種也是不同于Objective-C的forEach贪磺。那么逢防,兩者的使用有什么區(qū)別呢雕擂?今天,讓我們來聊一聊swift中遍歷方法的那些事产徊。

for in 與 forEach

同類型的泛型集合
  • for in
let array = ["1", "2", "3", "4", "5"]
for element in array {
    print(element)
}

打印結(jié)果: 1, 2, 3, 4, 5
  • forEach
let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
    print(element)
}

打印結(jié)果: 1, 2, 3, 4, 5

在集合的元素類型相同(比如上面的數(shù)組是String類型)的情況下,兩者遍歷效果相同蜀细,方便、敏捷,我們可以隨意選用坚冀。

不同類型元素的集合
  • for in
let array = [1, 2, 3, "cat", "rabbit"] as [Any]            // as [Any]是swift 3的語法要求戚绕,因?yàn)閿?shù)組中有兩種不同類型的元素,分別是:Int 归斤、String痊夭, 所以需要轉(zhuǎn)化成 [Any]類型
for element in array {
    print(element)
}

打印結(jié)果:1, 2脏里, 3她我, cat, rabbit
  • forEach
let array = [1, 2, 3, "cat", "rabbit"] as [Any]
array.forEach { (element) in
    print(element)
}

打印結(jié)果:1, 2番舆, 3酝碳, cat, rabbit

在集合的元素類型不相同(比如上面的數(shù)組是IntString類型)的情況下恨狈,兩者遍歷效果相同疏哗,方便、敏捷禾怠,我們可以也隨意選用返奉。

return關(guān)鍵字
  • for in
let array = ["1", "2", "3", "4", "5"]
for element in array {
    if element == "3" {
        return
    }
    print(element)
}
print("Hello World")

打印結(jié)果:1, 2
  • forEach
let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
    if element == "3" {
        return
    }
    print(element)
}
print("Hello World")

打印結(jié)果:1吗氏, 2芽偏, 4, 5牲证, Hello World

在使用return關(guān)鍵字的時(shí)候哮针,很明顯,for in中是當(dāng)符合當(dāng)前執(zhí)行語句時(shí)坦袍,程序直接終止到此并返回, 比如上面的元素 "4"十厢、"5""Hello World" 沒有被執(zhí)行捂齐;而forEach中是當(dāng)符合當(dāng)前執(zhí)行語句時(shí)蛮放,程序跳過本次判斷繼續(xù)執(zhí)行, 比如上面的元素"4"奠宜、"5"包颁、"Hello World"被執(zhí)行。

continue關(guān)鍵字
  • for in
let array = ["1", "2", "3", "4", "5"]
for element in array {
    if element == "3" {
        continue
    }
    print("element is \(element)")
}
print("Test \"continue\"")

打印結(jié)果:
element is 1
element is 2
element is 4
element is 5
Test "continue"
  • forEach
let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
    if element == "3" {
        continue
    }
    print(element)
}
print("Test \"continue\"")

錯(cuò)誤: 程序根本不能執(zhí)行
error:continue is only allowed inside a loop

在使用continue關(guān)鍵字的時(shí)候压真,for in可以正常遍歷并且執(zhí)行娩嚼,而且 continue的作用是跳出本次循環(huán),不影響后面的執(zhí)行滴肿; 而在 forEach中岳悟,swift是不允許這樣執(zhí)行的,報(bào)錯(cuò)的原因是說 continue只允許出現(xiàn)在循環(huán)語句中泼差,也就是說不能使用在 forEachclosure中贵少。

break關(guān)鍵字
  • for in
let array = ["1", "2", "3", "4", "5"]
for element in array {
    if element == "3" {
        break
    }
    print("element is \(element)")
}
print("Test \"continue\"")

打印結(jié)果:
element is 1
element is 2
Test "continue"
  • forEach
let array = ["1", "2", "3", "4", "5"]
array.forEach { (element) in
    if element == "3" {
        break
    }
    print(element)
}
print("Test \"continue\"")

錯(cuò)誤:程序根本不能執(zhí)行
error:Unlabeled 'break' is only allowed inside a loop or switch, a labeled break is required to exit an if or do

break關(guān)鍵字中,對(duì)于for in來說是可以的堆缘,跳出本層循環(huán)滔灶,也就是for循環(huán),然后繼續(xù)執(zhí)行后面的程序吼肥; 對(duì)于forEach來說录平,同continue關(guān)鍵字的效果一樣麻车,swift不允許這樣使用,原因說的是break只能用于循環(huán)語句或switch語句萄涯,break會(huì)退出本層循環(huán)語句绪氛。

Apple官方對(duì) forEach 的說明

下面是Apple的官方文檔解釋,對(duì)forEach遍歷方法做了個(gè)大致的介紹涝影,有興趣可以看一下

/// Calls the given closure on each element in the sequence in the same order
/// as a `for`-`in` loop.
///
/// The two loops in the following example produce the same output:
///
///     let numberWords = ["one", "two", "three"]
///     for word in numberWords {
///         print(word)
///     }
///     // Prints "one"
///     // Prints "two"
///     // Prints "three"
///
///     numberWords.forEach { word in
///         print(word)
///     }
///     // Same as above
///
/// Using the `forEach` method is distinct from a `for`-`in` loop in two
/// important ways:
///
/// 1. You cannot use a `break` or `continue` statement to exit the current
///    call of the `body` closure or skip subsequent calls.
/// 2. Using the `return` statement in the `body` closure will exit only from
///    the current call to `body`, not from any outer scope, and won't skip
///    subsequent calls.
///
/// - Parameter body: A closure that takes an element of the sequence as a
///   parameter.

</br>
小結(jié):

  • for in 能使用 return枣察、break、continue關(guān)鍵字燃逻,forEach不能使用 break序目、continue關(guān)鍵字
  • for in 和 forEach 在 return關(guān)鍵字 的使用上有著本質(zhì)的區(qū)別
  • 一般情況下,兩者都可通用伯襟,都方便猿涨、敏捷
  • for in 使用范圍比 forEach更廣

</br>

歡迎加入 iOS(swift)開發(fā)互助群:QQ群號(hào):558179558, 相互討論和學(xué)習(xí)姆怪!你想要的答案這里都有...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叛赚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子稽揭,更是在濱河造成了極大的恐慌俺附,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪掀,死亡現(xiàn)場(chǎng)離奇詭異事镣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)揪胃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門璃哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喊递,你說我怎么就攤上這事随闪。” “怎么了骚勘?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵铐伴,是天一觀的道長。 經(jīng)常有香客問我调鲸,道長盛杰,這世上最難降的妖魔是什么挽荡? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任藐石,我火速辦了婚禮,結(jié)果婚禮上定拟,老公的妹妹穿的比我還像新娘于微。我一直安慰自己逗嫡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布株依。 她就那樣靜靜地躺著驱证,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恋腕。 梳的紋絲不亂的頭發(fā)上抹锄,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音荠藤,去河邊找鬼伙单。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哈肖,可吹牛的內(nèi)容都是我干的吻育。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼淤井,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼布疼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起币狠,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤游两,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后总寻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器罐,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年渐行,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轰坊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祟印,死狀恐怖肴沫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕴忆,我是刑警寧澤颤芬,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站套鹅,受9級(jí)特大地震影響站蝠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卓鹿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一菱魔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吟孙,春花似錦澜倦、人聲如沸聚蝶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘勉。三九已至,卻和暖如春桩卵,著一層夾襖步出監(jiān)牢的瞬間验靡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工雏节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晴叨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓矾屯,卻偏偏與公主長得像兼蕊,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子件蚕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Swift提供了多種控制流聲明孙技。包括while循環(huán)來多次執(zhí)行一個(gè)任務(wù);if排作,guard和switch聲明來根據(jù)確定...
    BoomLee閱讀 1,958評(píng)論 0 3
  • 本章將會(huì)介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉(zhuǎn)移語句 continu...
    寒橋閱讀 727評(píng)論 0 0
  • Swift 提供了類似 C 語言的流程控制結(jié)構(gòu)妄痪,包括可以多次執(zhí)行任務(wù)的for和while循環(huán)哈雏,基于特定條件選擇執(zhí)行...
    窮人家的孩紙閱讀 706評(píng)論 1 1
  • 控制流 for循環(huán) for-in for while循環(huán) while repeat-while 條件語句 if s...
    zhenyu54閱讀 896評(píng)論 0 0
  • 我猜, 所謂的美好教主——鹿晗衫生,絕不僅僅是一個(gè)教主那么簡單裳瘪。 而是一個(gè)還不算太鮮明的劃分時(shí)代的界線。 很多年以來罪针,...
    段童閱讀 197評(píng)論 0 1