『Swift 5學習系列』-6. 條件語句(控制流程)

Shin Chao
10 min readOct 30, 2019

--

所謂的控制流程,簡單的就是程式中需要判斷的地方或是需要循環處理的地方,下面就先來介紹一下判斷有關的流程控制的條件語句。

條件語句:

什麼是條件語句呢?其實就是依據特定的條件來判斷執行哪一段程式碼,例如當使用者在購物網站買東西,當結帳時輸入錯誤的基本資訊時,則要顯示輸入錯誤的通知,反之則可以繼續填寫付款資訊。

【 if 】

if是最簡單的一個條件語句,基本用法如下:

『if + (條件) + {程式碼}』

當條件成立(true)時就會執行if的大括號所涵蓋範圍內的程式碼。配合if還有if的好朋友else『else{程式碼}』,else 就是當條件不成立(false)時會執行else的大括號所涵蓋範圍內的程式碼。那當條件不是只有成立與不成立怎麼辦?那就需要else if了,『else if(條件){程式碼}』,else if就像將多個if判斷鏈結起來,當第一個條件不成立就跳到第二個條件判斷,依序到最後看哪一個成立,若成立則就不會再向下判斷其他條件,else if之後是否要接else,也是跟if一樣,是可以選擇是否需要完整判斷來決定。需要注意else與else if時無法單獨使用的,一定要與if一起使用,簡單說就是需要先用if條件判斷,後面才能用else或else if。若是看文字說明還是不明白,可以看一下面的流程圖,因該會比較容易理解。

if判斷流程圖
if else判斷流程圖
else if判斷流程圖

if與else if的條件判斷,是可以省略小括號(),但我還是習慣加上,還有一個地方就是大括號的部分,就算是大括號{}內只有一行程式碼,大括號也不可以省略,雖然很多程式是可以省略的,但是在swift中是不允許的,這是swift比較特別的地方。

if每次並不是只能判斷一個條件,可以使用邏輯運算子(Logical Operator)將每個判斷條件連接再一起,確認最後結果是否成立,如if 條件1 && 條件2,當條件1成立並且條件2也成立,才會進入這if內的範圍內。

『範例說明』
5: 判斷變數salary是否大於90000,若是條件成立(true)則進入第6行,印出”Good job.”後結束條件判斷,直接跳到第13行,印出”End condition.”,若是條件不成立(false),則進入第7行下一個條件判斷。
7: 判斷變數salary是否大於50000,若是條件成立(true)則進入第8行,印出”It’s ok.”後結束條件判斷,直接跳到第13行,印出”End condition.”,若是條件不成立(false),則進入第9行的else,執行else內的程式。
9:當上面的條件判斷都不成立,則執行第10行與第11行,印出”Keep it up.”與”Change a good job.”後結束條件判斷,再執行第13行,印出”End condition.”

【 switch 】

switch的基本語句如下:

『switch + 變數或常數 + {case + 模式: + 程式}』

當有需要比較多個條件時,用if else時會變得比較複雜,這時候使用switch來做條件判斷,會容易許多。簡單來說switch就是將判斷條件的值(變數或常數)與所有的模式(pattern)進行匹配,若是相等,就執行那個模式內的程式碼,那你可能有點困惑什麼是模式,其實模式就是case 後的值,簡單的說就是條件。

當switch判斷某個case的條件成立時,會執行這case內的程式,執行完就會自動離開switch的的範圍,並不會繼續執行下一個case的處理流程,就算之後case的條件也成立時,一樣會自動離開switch的的範圍。

有一點必須注意,那就是switch的語句必須完備,簡單的說就是所有可能都必須有一個case的條件來處理,如果不能涵蓋所有的可能則需要在最後加一個default的默認模式處理,也就是沒涵蓋到的就是到default裡處理。

『範例說明』
6 - 7: case “A”這個條件,只要的letter的值是 “A”,就會進入這個case,並印出The letter A.,因為letter是”A”,所以會進入這個case,在印出The letter A.後,就會離開switch的條件判斷。
8 - 9: case “a”這個條件,只要的letter的值是 “a”,就會進入這個case,並印出The letter a.,因為letter是”A”,所以不會進入這個case。
10 - 11: 除了”A”與”a”以外的所有東西,都會進入這個default的模式之中,這就是之前所說的switch的語句必須完備,因為這樣所有的可能性都有被判斷與處理。

一個case可以處理多個條件,也就是相同處理流程的條件可以寫在同一個case裡,只要兩個條件之間使用逗號(,)分開就可以,如case “A”, “a”:,使用逗號將”A”與”a”分開。

『範例說明』
6: “A”與”a”這兩個條件,只要有其中一個是letter中的值,就會進入這個case,並印出The letter A or a.。

上面我們說到相同處理流程的模式可以寫在同一個case裡,當如果條件是數字,如1到100都要使用相同的處理流程,雖然可以如前面所說的方式使用逗號(,)來區隔,但是這樣太麻煩也容易出錯,所以這時候可以用區間匹配(Range Matching),來簡化這條件,那什麼是區間匹配(Range Matching)呢?還記得在之前『Swift 5學習系列』-5. 基本運算的區間運算子(Range Operator)嗎?其實是條件內加入區間運算子(Range Operator)讓整個區段的數值都屬於這個case。

『範例說明』
6: case 0 ..< 10這個條件,因為是..<,所以不包含10,只要的number的數值是0到9 ,就會進入這個case。
8: case 10 … 50這個條件,因為是…,所以包含50,只要的number的數值是10到50 ,就會進入這個case。
10: 除了0到50之間的數值以外的所有數值,都會進入這個default的模式之中處理。

其實case的條件也可以同時測試多個值,所以接下來要說的是一個叫做元組(Tuple)的東西,元組(Tuple)簡單的說就是用小括號()集合各種不同的資料,每個資料用逗號”,”作分隔,而裡面的資料不需要是同一個型別,不同型別也可以,有關元組(Tuple)的介紹之後會有較詳細的說明,現在只需要了解最基本的就好。在switch內case的模式(pattern)使用元組(Tuple)來比對條件,這裡有一個特別的用法,就是使用底線( _ )來匹配所有可能的值,也就是忽略這個條件,只比較元組(Tuple)內其他的資料。

『範例說明』
3: 宣告一個foodPrice的變數,型別為元組(Tuple),裡面有兩個資料,第一個是字串(string)型別,值為”魚”,第二個是整數(int)型別,值為30
6: case (“肉”,100)這個條件,只要foodPrice為(“肉”,100)就會進入,並印出100元的肉太貴。
8: case (“肉”,50)這個條件,只要foodPrice為(“肉”,50)就會進入,並印出50元的肉因該可以買。
10: case (_,30)這個條件,不論foodPrice這元組(Tuple)內的string為何只要foodPrice內int的值為30就會進入,因為底線( _ )來匹配所有可能的值,所以就是直接忽略string這個條件的資料,並印出30元的能買嗎?,因為foodPrice的值為(“魚”,30),所以前面的case都不符合,因為底線( _ )所以忽略掉“魚”,30符合條件,因此會進入這個case,最後印出30元的能買嗎?的資訊。
12: 除了上面的3種條件,其他元組(Tuple)以外的所有數值,都會進入這個default的模式之中處理。

最後要了解的就是在case 的條件內,還可以使用 where 來判斷額外的條件,這是什麼意思呢?就是雙重條件,滿足條件1並且還需要滿足條件2才會進入這case。但在說明where的使用前,還要了解一個東西,叫值綁定(Value Bindings),簡單說就是將判斷條件的值(變數或常數)綁定到一個臨時的常數或變數內,那這個常數或變數就可以在case內使用,這用說明文字比較不好理解,那就直接看範例來說明吧。

『範例說明』
6: case (let chineseScore, 60)的意思,就是將元組(Tuple)型別的變數score的第1個資料100指定給chineseScore,所以這個case只要元組(Tuple)型別的變數score的第2個資料為60就會符合這條件。
8: case let(chineseScore, englishScore) where chineseScore > englishScore的意思,就是將元組(Tuple)型別的變數score的第1個資料100指定給chineseScore,第2個資料為60指定給englishScore,where就是需要符合的條件,所以當 chineseScore大於englishScore,就符合這條件,因為現在score = (100,30)所以符合這條件,所以會印出“將元組(Tuple)的兩個資料分別指定給chineseScore與englishScore”。
10: case let(chineseScore, englishScore)的意思,就是將元組(Tuple)型別的變數score的第1個資料100指定給chineseScore,第2個資料為60指定給englishScore,但是因為沒有任何條件,所以就等於不論元組(Tuple)內的資料為何,都會符合因此進入這個case,所以default就不需要寫了。

--

--