Swift 程式語言 — Control Transfer Statements

讓我們把 Control Flow 運用得更強大吧!

Jeremy Xue
Jeremy Xue ‘s Blog
6 min readDec 10, 2018

--

前言:

上一篇文章我們大致上學會了 Control Flow 的語法,會使用 for-inif-else 以及 switch 等等…。這次教學我們會學習如何使用控制轉移語句( Control Transfer Statements )讓我們跳出或結束控制流進行其他的操作。

⎮控制轉移語句

控制轉移語句透過將控制從一段程式碼轉移到另一段程式碼來改變其執行的順序。Swift 中有五個控制轉移語句:

  • continue
  • break
  • fallthrough
  • return
  • throw

● Continue

continue 語句告訴循環停止正在做的事情,並且在開始下一次。continue 表示完成了目前的循環階段而還沒完全離開循環。

這邊我們想要當 index 為 15 的時候跳過數字,但不終止循環,正常我們的邏輯可能會寫一個 if index != 15 的判斷條件來執行,但這邊其實我們可以使用 continue 看起來更直觀:

你可以看見當 index == 15 的時候,它就繼續下一次的循環,所以跳過了下面印出當前值的 print

● Break

我們可以使用 break 來立即結束整個 Control Flow 的執行。當你結想提早結束 switch 或是 loop 的執行時,可以在其中加入 break 語句。

  • 循環中使用 break

假如我們使用上面的範例,將其中的 continue 改為 break 時,那麼當 index == 15 時,就會終止整個循環:

  • Switch 中使用 break

我們常常會在 swtich 語句中的 default 情況使用 break ,因為我們想要忽略這種狀況。所以當我們也想要在 index == 15 時忽略,那我們可以新增一個 case,在 switch case中加入一個 break 使其跳出 switch 區塊:

● Fallthrough

在 Swift 中,switch 語句不會貫穿到每個 case 的底部,並進入下一個 case。只要第一個匹配的 case 完成,整個 swtich 語句就會完成。相比之下,C 語言中要求你需要在每個 switch case 最後插入顯式的 break 語句去防止其通過。避免默認的通過也就表示著 Swift 中的 switch 語句比 C 的對應語句更簡潔和可預測,也避免他們錯誤的執行多個 switch case

今天我們在使用 switch 的時候,當出現第一個符合的條件時,就會執行其 case 中的程式碼,並結束 switch。所以當我們想要它繼續判斷是否符合下一個 case ,我們可以使用 fallthrough 語句來讓其進入下一個 case 中:

你可以發現我們使用 fallthrough 來使其進到下一個 case ,記得是會進入下一個 case 而不是貫穿到底。而當我們使用 fallthrough 的時候會忽略其判斷式的條件,會是直接進其 case 中:

fallthrough 關鍵字不會去檢查 switch case 執行的條件。fallthrough 關鍵字只會使程式碼移動到下一個 case 區塊內的語句,就跟 C 語言中標準的 switch 一樣。

備註:

這邊還有兩個尚未提到的控制轉移語句,returnthrow ,這兩者我們會分別在函數(Functions) 以及錯誤處理( Error Handle )提到,在這兩個主題內會比較常使用到這兩者。

⎮標籤語句 Labeled Statements

在 Swift 中,你可以在循環或是判斷式中嵌套其它循環或是判斷式,來創建複雜的 Control Flow。但是,循環和判斷式兩者都可以使用 break 使其提早結束執行。所以,如果能明確指定循環或判斷式需要 breakcontinue 會非常有用。

要實現這些目標,你可以標記語句標籤在循環或是判斷式。接者就能夠使用 breakcontinue 配合語句標籤中斷或繼續循環或判斷式。

下面我們實作一個簡單的循環,並且使用 MyLoop 作為循環的標籤:

MyLoop 是自定義的語句標籤

然後我們一樣新增一個判斷式,我們希望只有當 i 為 5 的時候,印出訊息。所以我們在其他不等於 5 的情況下讓它繼續執行 MyLoop 循環:

當然如果我們希望當 i 等於 5 的時候跳出循環,我們如同上面的操作一樣,我們只是換成 break MyLoop 使其終止循環:

當今天你的判斷式或是循環中有交雜著許多判斷式或是循環時,形成一個複雜的 Control Flow,這時使用標籤是一個很好的做法,能夠讓你標記一個標籤,並且由該標籤對判斷式或是循環進行操作。

或許這樣還看不出來差距,因此我來用一個雙循環的判斷式作為範例。

這邊我們有兩個循環加上一個 if 判斷式來判斷 x、y 是否相等,所以你會發現我們旁邊總共執行了 2500 次( 50 + 2450 )。但如果我今天想要獲取到兩個第一個共同值後,就結束整個循環的話,如果我們只是在 y 這個循環下 break,它依然會跑完整個 x 的循環,只有中斷 y 的循環:

所以我們就需要對第一個循環(x),標註一個標籤並且在第一個循環結束後,break (x)循環標籤名稱 來終止第一個循環:

你可以看到如果我們單純的讓兩個循環自己跑完,那可能需要很久的時間。但是我們今天對它設定一個標籤,並且終止最外層的循環,那麼我們所花的時間跟次數就少了很多。

後記:

那麼我們這次控制轉移語句教學就到這邊結束,雖然其中的 return 以及 throw 這兩個語句還沒有提到,但希望這次教學的語法大家能夠吸收,如何在 Control Flow 加入 Control Transfer Statements 讓我們的程序能夠更快速的獲取到結果。

--

--

Jeremy Xue
Jeremy Xue ‘s Blog

Hi, I’m Jeremy. [好想工作室 — iOS Developer]