上一篇介紹了 For-In Loop
以及 ForEach Loop
,今天要來介紹另外兩個迴圈使用方式: While
和 Repeat-While
。
我們先來看看 While Loop 的使用方式:
while 條件 {
要被執行的程式碼
}
While Loop 會依照一開始所設定的條件,判斷是否要進入迴圈中,假定為真,就會進入迴圈中,執行完要被執行的程式碼後,會回到最一開始那個條件,再判斷是否為真,持續進行直到不符合條件,才會跳出迴圈。
底下這邊有個範例,來說明 While Loop 運作方式:
let answerNumber = 5
var guessNumber = 0
while guessNumber != answerNumber {
guessNumber += 1
print("我猜一下...答案是 \(guessNumber) 嗎?")
}
print("猜中了,答案是 \(answerNumber)")
假使今天想要猜一個數字,answerNumber
來紀錄答案,guessNumber
來記錄猜的數字,這邊使用了 While Loop 來判斷假定猜的數字不是答案的話 ( guessNumber != answerNumber
),就進入迴圈,然而每一次回圈要執行的就是猜的數值加一 ( guessNumber += 1
),直到猜到答案為止。
那 Repeat-While 又是什麼呢?
repeat {
要被執行的程式碼
} while 條件
Repeat-While 在其他程式中可能又叫座 Do-While
,然而跟 While 最大的不同就是,Repeat-While 無論如何都會先執行一次要被執行的程式碼,執行完之後才會進行條件檢查,我們來看看相同的程式碼會有什麼差別:
let answerNumber = 5
var guessNumber = 0
repeat {
guessNumber += 1
print("我猜一下...答案是 \(guessNumber) 嗎?")
} while guessNumber != answerNumber
print("猜中了,答案是 \(answerNumber)")
一樣是answerNumber
來紀錄答案,guessNumber
來記錄猜的數字,我們來看一下印出來的結果:
// while loop
我猜的答案是 1
我猜的答案是 2
我猜的答案是 3
我猜的答案是 4
我猜的答案是 5
猜中了,答案是 5
// repeat-while loop
我猜的答案是 1
我猜的答案是 2
我猜的答案是 3
我猜的答案是 4
我猜的答案是 5
猜中了,答案是 5
奇怪不是有差別嗎?但是印出來的結果看起來沒有什麼差別啊?
那我們再來看下面這個範例,假定今天猜的數字一開始就是 5
,那麼結果會是如何:
// while loop
猜中了,答案是 5
// repeat-while loop
我猜一下...答案是 6 嗎?
我猜一下...答案是 7 嗎?
我猜一下...答案是 8 嗎?
我猜一下...答案是 9 嗎?
.
.
.
.
無限迴圈
這樣有發現哪裡有差別了嗎?
在 While Loop 一開始就會檢查猜的數值是否為答案,所以如果一開始就猜中的話就會直接跳過猜題的迴圈裡,但是如果是在 Repeat-While Loop,他不會管你一開始有沒有猜到,反而是直接先加一,再來看說你是不是猜對了。
但是這裡有一個問題了:這樣無條件先加一,依照我們的迴圈條件,他不就會一直卡死在裡面,而出不了迴圈嗎?
沒有錯,這就是再來要提到的問題,如果當你迴圈條件沒設定好,就很有可能導致你的 Code 陷入無窮迴圈,最終的結果就是大量佔用資源,導致系統當機。
所以我們來修改一下程式碼,還記得我們上一篇有說到可以使用 break
來跳出迴圈:
let answerNumber = 5
var guessNumber = 5
repeat {
if guessNumber == answerNumber { break }
guessNumber += 1
print("我猜一下...答案是 \(guessNumber) 嗎?")
} while guessNumber != answerNumber
print("猜中了,答案是 \(answerNumber)")
我們再來看看印出來的結果會是如何:
猜中了,答案是 5
我們讓他在一開始就檢查是否猜對答案,如果為真就跳出迴圈
這麼做的效果就會像是 While Loop 了 XD
雖然 While
和 Repeat-While
在執行上看似沒什麼差別,但是如果你仔細探討每一步執行過程,你就會發現原來 Repeat-While
無論如何都會先執行一次才判斷,所以我們可以這樣說:
了解到這兩個的差別後,之後在使用上要千萬注意,別讓你的 Code 陷入了爬不出來的無窮迴圈地獄!