iT邦幫忙

2025 iThome 鐵人賽

DAY 2
1
生成式 AI

iOS? AI-Yes!:用 Vide Coding 加速我的 Swift 學習曲線系列 第 2

Day 2 - 語法核心 (一):Swift 的變數、常數、流程控制與集合

  • 分享至 

  • xImage
  •  

要學習一個新的程式語言第一道高牆就是又多又雜的語法,或許有蠻多語言語法相似,但都有些許的差別。與其死記硬背,不如「聰明的偷懶」,讓AI成為你的專屬家教。

今天不求全部精通,目標是透過與 AI 的對話和練習,建立起對「變數/常數」、「流程控制」和「集合」這三大支柱的直覺理解。

挑戰難關前,先備好官方地圖

在開始用 AI 提問進行探索之前,我習慣先快速瀏覽一下 Apple 的官方文件,對今天要學習的內容有個大致的輪廓。這能讓我在向 AI 提問時,更有方向感,也能快速查證 AI 給出的答案是否準確。

  1. 官方聖經:《The Swift Programming Language》

    這是學習 Swift 最權威、最根本的來源。所有細節最終都應以這裡為準。

  2. 本日地圖:對應章節

    針對今天的內容,我主要會查閱以下幾個章節。特別是基本資料型態 (如 Int, String, Bool) 的觀念,都包含在 The Basics 這一章裡。

  3. 我常看的中文資源:Swift.gg

    這是一個由社群驅動的 Swift 文件翻譯網站,品質非常高。雖然是簡體中文,但某些看不懂的專有術語都可以在這邊找到解答。

變數與常數(var & let

  • 困惑點:什麼時候該用var,什麼時候該用let

  • AI協作:

    • 我的Prompt : 在 Swift 中,請用一個五歲小孩也聽得懂的比喻,簡短解釋 let 和 var 的差別。

    AI的回答:

    好的,想像一下你有兩種玩具箱:

    • let 就像一個透明的紀念品展示盒。

      你把心愛的鋼鐵人模型放進去後,爸爸就用強力膠把盒子黏死了。你每天都可以看到他是鋼鐵人,但你永遠不能把它換成別的玩具。它被「設定」好了,不能改變。

    • var 就像你平常裝玩具的樂高桶。

      你今天可以放紅色積木進去,明天可以把它們倒出來,換成藍色積木。桶子還是那個桶子,但裡面的東西隨時可以改變。

    所以,在 Swift 程式語言裡:

    • let 宣告的東西,給了它值之後就不能再變了。
    • var 宣告的東西,給了它值之後還可以換成新的
    • 這個比喻還不錯,看得出來let 是用來儲存一個你「不希望在未來被改變」的值,例如你的生日、身分證號碼。而 var 則是用在你「預期未來可能會改變」的值,例如你的年齡、或遊戲中的得分。

流程控制 (if-else, switch)

  • 困惑點:if-else 好像就可以解決所有判斷了,為什麼還需要switch ?

  • AI協作:

    • 我的Prompt:請用 Swift 設計一個「今天出門該穿什麼衣服」的情境。先用 if-else 實作,然後用 switch 語法重構它。天氣狀況請用一個枚舉 (Enum) 來定義。

    AI的回答:

    好的,這是一個非常適合用來說明 if-elseswitch 的情境。在 Swift 中,當條件判斷的對象是枚舉(Enum)時,switch 會是更安全且更具可讀性的選擇。

    首先,我們依照您的要求,先定義一個表示天氣狀況的枚舉 WeatherCondition

    // 註解:使用枚舉 (Enum) 來定義所有可能的天氣狀況
    // 這麼做可以讓程式碼更安全,因為我們只能使用這裡定義好的天氣。
    enum WeatherCondition {
        case sunny      // 晴天
        case cloudy     // 陰天
        case rainy      // 雨天
        case windy      // 颳風
        case snowy      // 下雪
    }
    

    情境設定

    讓我們假設今天的天氣是「雨天」,並根據這個天氣來決定穿搭建議。

    // 註解:設定一個 let 常數來代表今天的天氣狀況。
    // 你可以試著將它改成 .sunny 或 .windy 來看看不同的結果。
    let todayWeather: WeatherCondition = .rainy
    

    1. 使用 if-else 實作

    if-else 語法會逐一檢查條件,直到找到符合的項目為止。對於簡單的 2-3 個條件還可以,但當條件變多時,程式碼會顯得比較冗長。

    // 註解:宣告一個 var 變數,用來存放我們的穿搭建議。
    var clothingSuggestion: String
    
    // 註解:使用 if-else 鏈來判斷 todayWeather 的值。
    // 程式會從第一個 if 開始檢查,直到找到符合的條件為止。
    if todayWeather == .sunny {
        clothingSuggestion = "今天陽光普照,適合穿短袖、戴太陽眼鏡和帽子!"
    } else if todayWeather == .cloudy {
        clothingSuggestion = "今天是陰天,穿件舒適的薄長袖或 T-shirt 吧。"
    } else if todayWeather == .rainy {
        clothingSuggestion = "下雨了,記得帶雨衣、雨傘,並穿上防水的鞋子。"
    } else if todayWeather == .windy {
        clothingSuggestion = "風有點大,建議穿一件防風外套,避免著涼。"
    } else if todayWeather == .snowy {
        clothingSuggestion = "下雪了!快穿上你最暖的羽絨衣、毛帽和手套。"
    } else {
        // 雖然我們的枚舉涵蓋了所有情況,但一個好的 if-else 鏈通常會有一個 else 來處理預料之外的狀況。
        clothingSuggestion = "天氣未知,請打開窗戶看看再決定。"
    }
    
    print("--- if-else 的建議 ---")
    print(clothingSuggestion)
    // 輸出結果:下雨了,記得帶雨衣、雨傘,並穿上防水的鞋子。
    

    2. 使用 switch 重構

    現在,我們用 switch 語法來改寫上面的邏輯。switch 會直接匹配 todayWeather 的值,並執行對應 case 區塊中的程式碼。對於枚舉,switch 是 Swift 的首選,因為它更簡潔、意圖更明確,而且更安全。

    // 註解:使用 switch 時,我們可以將建議宣告為 let 常數。
    // 因為 Swift 編譯器能確保每一個 case 都會賦值,所以它只會被賦值一次。
    let switchClothingSuggestion: String
    
    // 註解:使用 switch 來匹配 todayWeather 的值。
    // 程式碼的意圖非常清楚:我們要根據 todayWeather 的不同情況 (case) 來做事。
    switch todayWeather {
    case .sunny:
        switchClothingSuggestion = "陽光正好,穿上短袖,戴上太陽眼鏡吧!"
    case .cloudy:
        switchClothingSuggestion = "陰天,很適合穿一件簡單的 T-shirt。"
    case .rainy:
        switchClothingSuggestion = "是雨天,雨具不可少!"
    case .windy:
        switchClothingSuggestion = "風大的日子,穿件防風外套就對了。"
    case .snowy:
        switchClothingSuggestion = "下雪了!穿得像顆球一樣保暖吧!"
    // 注意:這裡不需要 default,因為我們已經處理了 WeatherCondition 枚舉中的所有情況。
    // 這就是 switch 的「窮舉性」檢查,非常安全!
    }
    
    print("\n--- switch 的建議 ---")
    print(switchClothingSuggestion)
    // 輸出結果:是雨天,雨具不可少!
    

總結比較

特性 if-else switch
可讀性 當條件多時,結構較為雜亂,不易閱讀。 結構清晰,意圖明確,一眼就能看出是在根據一個值的不同情況做處理。
安全性 容易遺漏某個條件,且編譯器不會提醒。 窮舉性 (Exhaustiveness)。當處理枚舉時,Swift 編譯器會強制你處理所有 case,否則會報錯。這能有效防止因新增枚舉成員而忘記修改判斷邏輯的錯誤。
效能 在某些複雜情況下,可能比 switch 稍慢,因為它逐一檢查。 通常經過編譯器優化,查找速度更快(特別是對於字串或數字等)。
  • 從AI的回應可以發現,switch 不只是另一個語法,它在可讀性和安全性上,都比 if-else 強太多了!

集合 (Array, Dictionary, Set)

  • 困惑點:我只知道這些是用來處存資料的,但什麼時候該用哪一個?

  • AI協作:

    • 我的Prompt:請幫我簡單生成三組 Swift 資料:1. 一個 Array,存放我想看的電影清單。2. 一個 Dictionary,記錄我的購物車。3. 一個 Set,存放參加派對的朋友名單。

    AI的回答:

    好的,這是在 Swift 中表示這三種資料集合的簡單範例:

    1. Array (陣列): 電影清單

    Array 來存放電影清單非常合適,因為我們關心的是電影的順序(例如,想看的優先序)。

    // 註解:使用 Array<String> 來宣告一個存放字串的陣列。
    // 陣列中的項目是有順序的,且允許重複。
    let movieWatchlist: [String] = [
        "沙丘:第二部",
        "蜘蛛人:超越新宇宙",
        "腦筋急轉彎2",
        "沙丘:第二部" // 陣列可以有重複的項目
    ]
    
    print("電影清單: \(movieWatchlist)")
    

    2. Dictionary (字典): 購物車

    Dictionary 最適合用來表示購物車,因為我們需要用「商品名稱」(Key)來查找對應的「數量」(Value)。

    // 註解:使用 Dictionary<String, Int> 來宣告一個鍵為字串、值為整數的字典。
    // 字典是成對的鍵值儲存,沒有特定順序。
    var shoppingCart: [String: Int] = [
        "雞蛋": 2,
        "牛奶": 1,
        "麵包": 1
    ]
    
    print("購物車: \(shoppingCart)")
    

    3. Set (集合): 派對朋友名單

    Set 很適合用來記錄參加派對的朋友,因為 Set 會自動確保每個成員都是獨一無二的,避免重複登記同一個人。

    // 註解:使用 Set<String> 來宣告一個存放字串的集合。
    // 集合中的項目是無序的,且保證每個項目都獨一無二。
    var partyAttendees: Set<String> = [
        "Alice",
        "Bob",
        "Charlie",
        "Alice" // "Alice" 會被自動忽略,因為她已經在集合中了
    ]
    
    print("派對參加者: \(partyAttendees)")
    
  • 可以看得出來,在 Swift 中,Array有順序的清單,Dictionary鍵值配對的紀錄,而 Set 則是不重複的成員集合。


回頭看,其實不少,但透過這種「對話式」的學習,感覺就像在玩一場解謎遊戲,而不是在上生硬的課。今天不只學了語法,也學會了如何把 AI 變成我們的良師益友。

明天,我們將要挑戰的是聽說勸退最多 Swift 新手的「三大魔王」:Optional (?)函式 (Function)閉包 (Closure)


上一篇
Day 1 - 不只學 iOS,我們用生成式 AI 重新定義 App 開發
下一篇
Day 3 - 語法核心 (二):深入解析 Optional (?) 、函式 (Function) 與閉包 (Closure)
系列文
iOS? AI-Yes!:用 Vide Coding 加速我的 Swift 學習曲線4
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言