Swift 控制流程總覽 (Control Flow)

Swift 提供了所有現代程式語言應有的控制流程結構,同時加入了一些讓程式碼更安全、更易讀的特性。

這篇文章將作為 Swift 控制流程的總覽導引,你可以點擊各個章節連結深入了解詳細用法。

迴圈 (Loops)

用來多次執行一段程式碼。Swift 提供了幾種常見的迴圈類型:

  • for-in:最常用的迴圈。用於遍歷序列 (如陣列、範圍、字串)。
  • while:當條件為真時,持續執行。
  • repeat-while:先執行一次,再檢查條件 (類似其他語言的 do-while)。
// For-in 範例
for index in 1...5 {
    print("第 \(index) 次迴圈")
}

深入了解:Swift 迴圈 (For-in, While)

條件判斷 (Conditional Branching)

根據特定條件決定執行哪一段程式碼。

If 與 Guard

  • if:最基本的條件判斷。
  • guard:Swift 的特色語法,專門用於早期退出 (Early Exit) 邏輯。它強迫你必須處理條件不成立的情況 (通常是 returnthrow),讓主邏輯區塊保持只有一層縮排,避免「災難金字塔 (Pyramid of Doom)」。
func checkAge(age: Int) {
    guard age >= 18 else {
        print("未成年")
        return
    }
    print("歡迎進入") // 這裡可以確定 age >= 18
}

深入了解:Swift If Else Guard

Switch 語句

Swift 的 switch 非常強大,遠超傳統 C 語言的 switch:

  • 不需要 break:預設不會掉入下一個 case (No Implicit Fallthrough)。
  • 模式匹配:可以匹配區間、元組 (Tuples)、型別轉換,甚至自訂邏輯。
  • 必須完整 (Exhaustive):編譯器會強制你處理所有可能的情況。
let point = (1, 1)
switch point {
case (0, 0):
    print("原點")
case (_, 0):
    print("在 X 軸上")
case (0, _):
    print("在 Y 軸上")
default:
    print("其他位置")
}

深入了解:Swift Switch

控制轉移 (Control Transfer)

這些語句會改變程式碼執行的順序:

  • continue:跳過本次迴圈的剩餘指令,直接開始下一次迴圈。
  • break:立克終止當前的迴圈或 switch 語句。
  • fallthrough:在 switch 中特意讓程式執行下一個 case (Swift 預設不會這麼做)。
  • return:從函式中返回。
  • throw:拋出錯誤,觸發錯誤處理機制。

延遲執行 (Defer)

defer 是一個非常有用的控制關鍵字。它定義的程式碼區塊,會在當前作用域 (Scope) 結束前一定被執行,無論離開的原因是正常執行完畢、return、還是發生錯誤 throw

這通常用於清理工作,例如關閉檔案、釋放資源、重置狀態等。

func openFile() {
    print("1. 開啟檔案")
    
    defer {
        // 這個區塊會在 openFile 函式結束前的最後一刻執行
        print("3. 關閉檔案 (Defer)")
    }
    
    print("2. 讀取檔案內容...")
    
    // 即使這裡發生錯誤或 return,defer 區塊依然會執行
}

openFile()
// 輸出順序:
// 1. 開啟檔案
// 2. 讀取檔案內容...
// 3. 關閉檔案 (Defer)

使用 defer 可以將開啟與關閉資源的程式碼寫在一起,大大降低忘記釋放資源的風險。