『Swift 5學習系列』-7. 迴圈語句(控制流程)

Shin Chao
7 min readNov 1, 2019

--

所謂的控制流程,簡單的就是程式中需要判斷的地方或是需要循環處理的地方,先前已經說明過有關判斷條件的條件語句,那接下來就先來介紹一下有關的循環處理的迴圈語句。

迴圈語句:

什麼是迴圈語句呢?其實就是依據條件重複執行某段程式碼,透過迴圈可以執行一連串重複的動作,例如你想要1加到10000,如果不用迴圈,你可能要打字打到天荒地老,用了迴圈就簡單多了,只需要幾行程式碼就完成了,所以這因該是寫程式中經常使用到的控制方式之一。

【for in】

for in的基本語句為如下:

『for + 常數名稱 in + 某一個可以取出單獨資料的集合 + {程式碼}』

看到這個語句你可能不了解什麼是常數名稱與某一個可以取出單獨資料的集合,首先說到常數名稱,因為夾在for和 in中的常數不需要加上let宣告的,只需要給一個名稱,然後每次進入迴圈前會自动赋值,之後在大括號{}內都是用此常數做運算的。再來就是說明(某一個可以取出單獨資料的集合)是什麼了,其實這邊妳因該會想到之前說過的range,因為range就是一段數字區間,如0…5,代表的是數字0、1、2、3、4、5,總共6個數字的集合,其他尚未說明的還有許多資料的集合,如陣列(Array)、字典(Dictionary)等等,之後會再做說明。for in的離開條件是什麼呢?就是當所有的資料都從頭到尾都執行過後,就會離開for in這迴圈。

『範例說明』
3 - 5: 這是一個for in的迴圈,看到range 0…5,所以number的值,在第一次進入迴圈時為0,所以印出“number is 0”,第二次進入迴圈時為1,所以印出“number is 1”,number會依照range的範圍依序帶入迴圈中,直到超過範圍停止,所以最後會停在5,所以最後一行會印出“number is 5”。

那每次都只能增加1嗎?其實可以配合用stride這function來達到隨便增加多少的功能,不論是負數還是浮點數都可以,使用方式如『for + (常數名稱) in + stride(from: 起始值, to: 結束值, by: 每次增加的值) + {程式碼}』,如果使用to則不會包含最後的結束值,簡單說如果to:10,就是不包含10,只有到9,如果要包含10那就將to 改為through,那就會包含最後的結束值,所以這樣就可以包含10。

『範例說明』
3 - 5: 這是一個for in的迴圈,看到stride的條件是開始值為0,結束值為10,每次加2,因為使用to,所以最後一個只會印出“(by)Number is 8”。
7 - 9: 這是一個for in的迴圈,看到stride的條件是開始值為0,結束值為10,每次加2,因為使用through,所以最後一個只會印出“(by)Number is 10”。

如果不需要資料集合內的每個資料,可以使用下底線( _ )來替代常數名稱来忽略這個值,就為了利用執行迴圈某個次數而已。

『範例說明』
6 - 9: 這是一個for in的迴圈,看到range 0 ..< 12,而常數名稱為_,所以這個迴圈並不需要知道每次進入迴圈中每一個資料的值,只是單純為了只是執行迴圈的次數,所以這迴圈會執行12次,每次都會將salary加上money之後再存回salary。
10 印出“He was offered a salary of 288000 a year.”

接下來就是要介紹之前switch也有說過的where了,for in也可以使用where 來判斷額外的條件,當條件滿足才能進入迴圈之中。

『範例說明』
5 - 8: 這是一個for in的迴圈,看到range為 0 … 100,而常數名稱為number,所以number會是從0到100,但是後面接了一個where,所以當where條件成立才會進入迴圈,所以當number %2等於0成立時,才會進入迴圈,並將evenSum加上偶數的number,再存回evenSum。
9: 印出“0到100所有偶數的總和為2550”

【While】

while的基本語句如下:

『while + 判斷條件 + {程式碼}』

while 迴圈從計算單一條件開始。如果條件成立( true) ,會進入while內的程式碼,執行完後再回到while在判斷條件是否成立,會一直重複執行,直到條件變為不成立 (false) 。但是要注意的是判斷條件的變數需要事先宣告,這是與for in不同的地方。

『範例說明』
3: 宣告變數number並給予初始值5。
5 - 8: 進入while的判斷條件是number要大於0,目前number是5所以會進入while並印出”5",印完後number會減ㄧ後存到number,這時while內的程式已經執行完,所以又會回到while的判斷條件,判斷是否numner大於0,直到number為0才會停止while的判斷離開,所以可以看到印出”5"、”4"、”3"、”2"、”1"。

while有可能判斷條件不成立,完全不會執行while內的程式,如果需要至少執行一次的需求,那就要用repeat了,repeat與while一起使用時,基本語句為『repeat + {程式碼} + while + (判斷條件)』,所以repeat與while的組合是每次在迴圈結束時判斷條件是否成立,而單獨使用while則是在迴圈開始的時候判斷條件是否成立,這是這兩種用法的差異。

『範例說明』
3: 宣告變數number並給予初始值0。
5–8: 因為是repeat,所以會進入迴圈印出”0",然後number減一後存回number,之後while的判斷條件是number要大於0,目前number是-1所以判斷條件不成立,所以迴圈會終止。

for in與while分別適合在什麼時候使用呢?其實從兩種的使用方式可以猜到,for in適合固定次數的迴圈,while適合不知道次數的迴圈。

最後一定要注意的是 while因為只有判斷條件,但是並沒有像for in一樣有次數的範圍,所以在使while時必須要有讓判斷條件成立的時候,不然就會進入無窮迴圈(infinite loop),進入無窮迴圈(infinite loop)會怎麼樣呢?那你的程式永遠也無法繼續,只會在while內一直循環。像剛剛的範例如果沒有number -= 1這行,就是會一直印出”0"的無窮迴圈(infinite loop)。

--

--