條件式控制流(續)
除了while
迴圈以外,還有另外兩種條件式控制,但不是迴圈的語法,可以依照條件式計算式的結果,決定程式運行的方向,它們分別是if
條件語句和switch
條件語句,條件語句的特色是它們並不重複的執行指令,而是依照情境的差異,決定執行不同的指令,它們的內容都只會執行一次。
if (條件A) { // 符合條件A時執行的程式碼 } else if (條件B) { // 符合條件B時執行的程式碼 } else if (條件C) { // 符合條件C時執行的程式碼 } ... ... else { // 不符合條件A、B、C時執行的程式碼 }
if
語句和while
的結構很像,不過它可以依照一種以上的不同情境,分別決定要執行怎樣的程式碼,每個條件語句後面各有各自的{
和}
包裹的程式碼,由上而下執行到電腦認為某個條件為true
時,就會進入執行這段程式碼,無視其他的程式碼。
switch
語句和if
有類似之處,差別在於switch
後面的算式不必須是一個條件式計算式,而是會嘗試把某個物件和若干個狀態進行配對,並且根據第一個配對成功的結果,執行相應的程式碼,請打開本週的範例程式碼,看看我們的me
物件右轉的部分:
mutating func 右轉() { switch 面向 { case 方向.北方: 面向 = 方向.東方 print("我從面向北方轉為面向東方") case 方向.東方: 面向 = 方向.南方 print("我從面向東方轉為面向南方") case 方向.南方: 面向 = 方向.西方 print("我從面向南方轉為面向西方") case 方向.西方: 面向 = 方向.北方 print("我從面向西方轉為面向北方") default: print("我面對的顯然不是一個合理的方向,右轉失敗") } }
這段程式查找me
物件的面向
屬性,並且根據面對的方向不同,將之轉到對應的右轉方向,並且列印訊息通知使用者。最後,所有的switch
條件語句中,若我們沒有把所有可能性都伴隨case
列出,則最後都必定得加上default:
,處理所有的case
條件都不符合的情況,但if
條件語句並不是一定得有else if
和else
,在使用的時候需要特別留意。
學完了這麼多新的算式,是時候回來和我們的me
物件玩耍了,現在我們新增一個變數體力
來儲存me
物件我
的剩餘體力,每走一步就讓體力
減少1
,直到體力
變成0
就走不動了,這邊先示範一段程式碼:
var 體力:Int = 10 while 體力 > 0 { if 我.座標.y >= 3 { // 往北走太遠了,轉頭 我.右轉() 我.右轉() } else if 我.座標.y <= -3 { // 往南走太遠了,轉頭 我.右轉() 我.右轉() } 我.前進() 體力 = 體力 - 1 } // while 迴圈在此結束 print("走不動了...")
這段程式碼可以控制我
在南北方向上來回走,直到離原點的距離變成3
或以上的時候,就轉頭,直到體力耗盡為止。大家可以試著把這段程式碼複製貼上到範例程式碼末端執行看看結果,也可以自行改動數值試試。
現在我們已經學會不少控制程式的方式了!試著完成看看這些任務(體力有多少可以自己設定):
- 讓
我
以螺旋狀遠離原點行走,直到體力耗盡為止。- 讓
我
不斷地前進,如果離x
軸或y
軸的垂直距離超過3
,就左轉,直到體力耗盡為止。- 讓
我
鋸齒狀的往東北方前進(先往北一步、再往東一步的循環),直到體力耗盡為止。