要學習一個新的程式語言第一道高牆就是又多又雜的語法,或許有蠻多語言語法相似,但都有些許的差別。與其死記硬背,不如「聰明的偷懶」,讓AI成為你的專屬家教。
今天不求全部精通,目標是透過與 AI 的對話和練習,建立起對「變數/常數」、「流程控制」和「集合」這三大支柱的直覺理解。
在開始用 AI 提問進行探索之前,我習慣先快速瀏覽一下 Apple 的官方文件,對今天要學習的內容有個大致的輪廓。這能讓我在向 AI 提問時,更有方向感,也能快速查證 AI 給出的答案是否準確。
官方聖經:《The Swift Programming Language》
這是學習 Swift 最權威、最根本的來源。所有細節最終都應以這裡為準。
本日地圖:對應章節
針對今天的內容,我主要會查閱以下幾個章節。特別是基本資料型態 (如 Int, String, Bool) 的觀念,都包含在 The Basics 這一章裡。
我常看的中文資源:Swift.gg
這是一個由社群驅動的 Swift 文件翻譯網站,品質非常高。雖然是簡體中文,但某些看不懂的專有術語都可以在這邊找到解答。
var
& let
)困惑點:什麼時候該用var
,什麼時候該用let
AI協作:
在 Swift 中,請用一個五歲小孩也聽得懂的比喻,簡短解釋 let 和 var 的差別。
AI的回答:
好的,想像一下你有兩種玩具箱:
let 就像一個透明的紀念品展示盒。
你把心愛的鋼鐵人模型放進去後,爸爸就用強力膠把盒子黏死了。你每天都可以看到他是鋼鐵人,但你永遠不能把它換成別的玩具。它被「設定」好了,不能改變。
var 就像你平常裝玩具的樂高桶。
你今天可以放紅色積木進去,明天可以把它們倒出來,換成藍色積木。桶子還是那個桶子,但裡面的東西隨時可以改變。
所以,在 Swift 程式語言裡:
- 用
let
宣告的東西,給了它值之後就不能再變了。- 用
var
宣告的東西,給了它值之後還可以換成新的。
let
是用來儲存一個你「不希望在未來被改變」的值,例如你的生日、身分證號碼。而 var
則是用在你「預期未來可能會改變」的值,例如你的年齡、或遊戲中的得分。if-else
, switch
)困惑點:if-else
好像就可以解決所有判斷了,為什麼還需要switch
?
AI協作:
請用 Swift 設計一個「今天出門該穿什麼衣服」的情境。先用 if-else 實作,然後用 switch 語法重構它。天氣狀況請用一個枚舉 (Enum) 來定義。
AI的回答:
好的,這是一個非常適合用來說明
if-else
和switch
的情境。在 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 稍慢,因為它逐一檢查。 |
通常經過編譯器優化,查找速度更快(特別是對於字串或數字等)。 |
switch
不只是另一個語法,它在可讀性和安全性上,都比 if-else
強太多了!Array
, Dictionary
, Set
)困惑點:我只知道這些是用來處存資料的,但什麼時候該用哪一個?
AI協作:
請幫我簡單生成三組 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)。