iT邦幫忙

2025 iThome 鐵人賽

DAY 10
0
Mobile Development

Swift iOS 開發新手村:從入門到 AI 聊天室系列 第 10

Day 10|Swift 重複執行:搞懂 for、while、repeat

  • 分享至 

  • xImage
  •  

恭喜我們來到第十天,學習旅程已完成三分之一啦~

我們已經學會如何儲存資料和做出基本判斷,但到目前為止,我們的程式碼還像個只會從頭演奏到尾的樂手。今天,我們要升格成為「總指揮(Conductor)」!

我們將學習如何精準地控制程式的執行流程——你可以命令一段旋律重複演奏(迴圈)、讓某個樂器暫時休止(跳過),或是在最高潮時讓樂章戛然而止(終止)。準備好拿起你的指揮棒,讓程式碼跟隨你的節奏了嗎?嗯?

今日學習重點

  • 迴圈(Loops):讓程式碼重複執行,處理重複性任務
  • 控制轉移語句(Control Transfer):跳轉程式流程,如 breakcontinue
  • 提前退出(Early Exit):使用 guard 語句,讓程式碼更安全、更簡潔。

迴圈:重複執行任務的利器

Swift 提供了 for-inwhilerepeat-while 三種迴圈,讓你輕鬆處理需要重複執行的任務。

For-in 迴圈

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 迴圈

while 迴圈在條件為 true 時持續執行,先判斷條件再執行程式碼。

基本格式:

while 條件判斷 {
    // 條件為 true 時執行的程式碼
}

範例:

var n = 2
while n < 20 {
    n = n * 2
}
print(n) // 印出 32

while 迴圈的執行過程

  1. 檢查 n (2) < 20,成立,執行 n = 2 * 2n 變為 4
  2. 檢查 n (4) < 20,成立,執行 n = 4 * 2n 變為 8
  3. 檢查 n (8) < 20,成立,執行 n = 8 * 2n 變為 16
  4. 檢查 n (16) < 20,成立,執行 n = 16 * 2n 變為 32
  5. 檢查 n (32) < 20,不成立,迴圈結束。
    print(n),此時 n 的值是 32

Repeat-while 迴圈

repeat-while 迴圈會先執行一次程式碼區塊,再判斷條件是否成立,至少會執行一次。

基本格式:

repeat {
    // 先執行的程式碼
} while 條件判斷

範例:

var m = 512
repeat {
    m = m * 2
} while m < 100
print(m) // 印出 1024

因為先執行一次,m 變成 1024,條件不成立,迴圈結束

continue:跳過本次迴圈

遇到 continue,會立即停止本次迴圈,直接進入下一次:

for n in 1...10 {
    if n % 2 == 0 {
        continue // 跳過偶數
    }
    print(n)
}
/* 輸出:
1
3
5
7
9
*/

break:終止整個迴圈

遇到 break,會立即終止整個迴圈,程式往後執行:

for n in 1...10 {
    if n > 2 {
        break // 遇到 n > 2 立即停止迴圈
    }
    print(n)
}
/* 輸出:
1
2
*/

break 也可用於 switch,提前結束比對。

提前退出 guard:程式碼更清晰安全

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 基礎
內容:今天學習了流程控制
*/

帶標籤的語句(Labeled Statements)

多層巢狀迴圈時,標籤可讓你指定要跳出的迴圈層級:

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 遍歷集合,以及根據條件重複執行的 whilerepeat-while 迴圈。

我們還學會了如何用 breakcontinue 來精準地控制迴圈流程,更認識了能大幅提升程式碼清晰度的 guard 提前退出語法。掌握這些工具,你的程式碼就能像精準的指揮家一樣,依照你的指令完成各種複雜的任務!

明日預告

到目前為止,我們的程式碼都是寫完就執行掉了,但如果有一段邏輯需要被重複使用,例如計算不同商品折扣後的價格,我們總不能一直複製貼上吧?

明天,我們就要來學習如何打造可重複使用的「程式積木」:函式(Functions)!你將學會如何將一段特定的功能打包起來,為它命名,然後像呼叫魔法一樣,隨時隨地重複使用它。我們還會學習如何傳遞「原料」(參數)給它,並取得它回傳的「成品」(回傳值)。學會函式,是讓你的程式碼變得模組化、乾淨且易於維護的第一步!

敬請期待《Day 11|Swift 函式大解析:打造可重複使用的程式積木!》


上一篇
Day 9|Swift 條件判斷超入門!搞懂 if 和 switch 就靠這一課!
下一篇
Day 11|Swift 函式大解析:打造可重複使用的程式積木!
系列文
Swift iOS 開發新手村:從入門到 AI 聊天室11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言