iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Software Development

給我 30 天,給你一輩子:Swift 從零開始系列 第 13

Day 13 | Swift Loops 的糾葛終章:While 和 Repeat-While

  • 分享至 

  • xImage
  •  

Control Flow:Loops

上一篇介紹了 For-In Loop 以及 ForEach Loop,今天要來介紹另外兩個迴圈使用方式: WhileRepeat-While

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 條件

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


雖然 WhileRepeat-While 在執行上看似沒什麼差別,但是如果你仔細探討每一步執行過程,你就會發現原來 Repeat-While 無論如何都會先執行一次才判斷,所以我們可以這樣說:

  • While 是一個前測式迴圈
  • Repeat-While 是一個後測式迴圈

了解到這兩個的差別後,之後在使用上要千萬注意,別讓你的 Code 陷入了爬不出來的無窮迴圈地獄!/images/emoticon/emoticon20.gif


上一篇
Day 12 | Swift Loops 的糾葛:For-in 和 ForEach
下一篇
Day 14 | Swift 流程控制:If 和 Switch
系列文
給我 30 天,給你一輩子:Swift 從零開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言