恭喜我們來到第十天,學習旅程已完成三分之一啦~
我們已經學會如何儲存資料和做出基本判斷,但到目前為止,我們的程式碼還像個只會從頭演奏到尾的樂手。今天,我們要升格成為「總指揮(Conductor)」!
我們將學習如何精準地控制程式的執行流程——你可以命令一段旋律重複演奏(迴圈)、讓某個樂器暫時休止(跳過),或是在最高潮時讓樂章戛然而止(終止)。準備好拿起你的指揮棒,讓程式碼跟隨你的節奏了嗎?嗯?
break
和 continue
guard
語句,讓程式碼更安全、更簡潔。Swift 提供了 for-in
、while
和 repeat-while
三種迴圈,讓你輕鬆處理需要重複執行的任務。
for-in
迴圈最適合用來遍歷一個集合,例如數字區間、陣列、字典,或字串中的每一個字元。
基本格式:
for 變數名稱 in 集合或範圍 {
// 重複執行的程式碼區塊
}
範例:
for index in 1...3 {
print(index)
}
/* 輸出:
1
2
3
*/
若只需要重複執行次數,但不使用索引,則用底線 _
忽略:
let base = 2
var total = 1
for _ in 1...3 {
total *= base
}
print(total) // 印出 8
遍歷陣列:
let fruits = ["Apple", "Book", "Cat"]
for item in fruits {
print(item)
}
/* 輸出:
Apple
Book
Cat
*/
遍歷字典會取得鍵值對元組:
let prices = ["Apple": 12, "Book": 3, "Cat": 5]
for (key, value) in prices {
print("\(key) : \(value)")
}
// 印出:(順序不固定)
// Apple : 12
// Book : 3
// Cat : 5
while
迴圈在條件為 true
時持續執行,先判斷條件再執行程式碼。
基本格式:
while 條件判斷 {
// 條件為 true 時執行的程式碼
}
範例:
var n = 2
while n < 20 {
n = n * 2
}
print(n) // 印出 32
n
(2
) < 20
,成立,執行 n = 2 * 2
,n
變為 4
。n
(4
) < 20
,成立,執行 n = 4 * 2
,n
變為 8
。n
(8
) < 20
,成立,執行 n = 8 * 2
,n
變為 16
。n
(16
) < 20
,成立,執行 n = 16 * 2
,n
變為 32
。n
(32
) < 20
,不成立,迴圈結束。print(n)
,此時 n
的值是 32
。repeat-while
迴圈會先執行一次程式碼區塊,再判斷條件是否成立,至少會執行一次。
基本格式:
repeat {
// 先執行的程式碼
} while 條件判斷
範例:
var m = 512
repeat {
m = m * 2
} while m < 100
print(m) // 印出 1024
因為先執行一次,m
變成 1024
,條件不成立,迴圈結束
遇到 continue
,會立即停止本次迴圈,直接進入下一次:
for n in 1...10 {
if n % 2 == 0 {
continue // 跳過偶數
}
print(n)
}
/* 輸出:
1
3
5
7
9
*/
遇到 break
,會立即終止整個迴圈,程式往後執行:
for n in 1...10 {
if n > 2 {
break // 遇到 n > 2 立即停止迴圈
}
print(n)
}
/* 輸出:
1
2
*/
break
也可用於 switch
,提前結束比對。
在 guard
出現之前,如果我們要處理多層條件檢查(例如 if let
),常常會寫出像金字塔一樣層層內縮的程式碼,這被戲稱為「金字塔厄運(Pyramid of Doom)」,可讀性很差:
// 使用 if let 的金字塔寫法
func postArticleWithIfLet(article: [String: String]) {
if let title = article["title"] {
if let content = article["content"] {
// 真正要做的事被包在最深處
print("文章發布成功!")
print("標題:\(title)")
print("內容:\(content)")
} else {
print("錯誤:文章缺少內容。")
}
} else {
print("錯誤:文章缺少標題。")
}
}
guard
就是為了解決這個問題而生的。它讓我們能將「錯誤處理」的程式碼放在最前面,確保條件都滿足後,才在最外層執行主要邏輯。
func post(article: [String: String]) {
guard let insideTitle = article["title"] else {
print("錯誤:文章缺少標題")
return
}
guard let insideContent = article["content"] else {
print("標題是 \(insideTitle),但缺少內容")
return
}
print("文章發布成功!")
print("標題:\(insideTitle)")
print("內容:\(insideContent)")
}
post(article: ["title": "Swift 基礎"])
// 印出 標題是 Swift 基礎,但缺少內容
post(article: ["title": "Swift 基礎", "content": "今天學習了流程控制"])
/* 輸出:
文章發布成功!
標題:Swift 基礎
內容:今天學習了流程控制
*/
多層巢狀迴圈時,標籤可讓你指定要跳出的迴圈層級:
var number = 1
gameLoop: while number < 10 {
switch number {
case 1...4:
number += 1
case 5:
number *= 10
break gameLoop // 終止 gameLoop 標籤的迴圈
default:
number += 1
}
}
print(number) // 印出 50
今天我們掌握了 Swift 中控制程式流程的核心技巧!你學會了使用 for-in
遍歷集合,以及根據條件重複執行的 while
和 repeat-while
迴圈。
我們還學會了如何用 break
和 continue
來精準地控制迴圈流程,更認識了能大幅提升程式碼清晰度的 guard
提前退出語法。掌握這些工具,你的程式碼就能像精準的指揮家一樣,依照你的指令完成各種複雜的任務!
到目前為止,我們的程式碼都是寫完就執行掉了,但如果有一段邏輯需要被重複使用,例如計算不同商品折扣後的價格,我們總不能一直複製貼上吧?
明天,我們就要來學習如何打造可重複使用的「程式積木」:函式(Functions)!你將學會如何將一段特定的功能打包起來,為它命名,然後像呼叫魔法一樣,隨時隨地重複使用它。我們還會學習如何傳遞「原料」(參數)給它,並取得它回傳的「成品」(回傳值)。學會函式,是讓你的程式碼變得模組化、乾淨且易於維護的第一步!
敬請期待《Day 11|Swift 函式大解析:打造可重複使用的程式積木!》