iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Mobile Development

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

Day 3|Swift 可選型別全攻略:從安全解包到隱式解析,告別程式崩潰恐懼!

  • 分享至 

  • xImage
  •  

昨天我們學會了變數、資料型別與字串插值,已經能讓程式和我們互動。

但現實世界中,有時候資料並不一定會出現,比如使用者還沒填寫名字、伺服器還沒回來資料...
這時候,我們就得學會 Swift 中超級重要的觀念:可選型別(Optional)

今日學習重點

  • 可選型別 (Optional):一個可能為空的包裹
  • 安全解包 (Safe Unwrapping):如何優雅地拆包裹
  • 危險的捷徑:強制解包與隱式解析
  • 總結比較:三種型別的對決

安全解包 (Safe Unwrapping):如何溫柔的拆包裹

在 Swift 裡,一個值「可能存在,也可能為空 (nil)」的變數,就稱為 可選型別 (Optional),我們在型別後面加上問號 ? 來宣告它。

var score: Int? = nil
score = 80

因為 Optional 變數有可能是空的,直接使用會有風險。
所以,我們要像「打開包裹」一樣先確認裡面到底有沒有值,這個動作就稱為 解包 (unwrap)

最安全也最常見的解包方法就是 if let
它會嘗試解包,只有在裡面真的有值的時候,才會執行 {} 裡面的程式碼:

if let realScore = score {
    print("你的分數是 \(realScore)")
} else {
    print("分數還沒出來哦!")
}

這樣寫能 100% 避免因 nil 造成的閃退,是處理 Optional 的首選方式!

危險的捷徑:強制解包與隱式解析

強制解析(forced unwrapping)

當你非常確定一個可選型別(Optional)裡面一定有值的時候,可以使用強制解析(forced unwrapping),直接在變數名稱後面加上一個驚嘆號 !,直接取出變數中的值來做使用:

let number3: Int? = 500  // 可選整數,有值500
print(number3!)          // 強制解析,直接使用裡面的500

不過要注意的是,如果對一個目前是 nil 的可選型別使用強制解析,就會直接造成程式錯誤:

var number4: Int?        // 尚未賦值,預設是 nil
// print(number4!)       // 如果執行這行會造成錯誤,因為沒有值

隱式解析可選型別(implicitly unwrapped optional)

它本質上是可選型別,但你向編譯器做出一個承諾:「我保證,在存取這個變數的任何時候,它的值都絕對不會是 nil」。基於這個承諾,Swift 才允許你直接使用它,而不用手動解包。
使用方式很簡單,就是將可選型別的問號 ? 改成驚嘆號 !

這樣一來,使用時就不用每次都手動解包(加驚嘆號),Swift 會自動幫你解開包裹,直接取用值:

// 一般可選型別,使用時需要強制解包
let optionalString: String? = "Hello"
// 使用時要加驚嘆號
let normalString: String = optionalString!

// 隱式解析可選型別,賦值後使用時不用加驚嘆號
let implicitlyUnwrappedString: String! = "Hi there"
let anotherString: String = implicitlyUnwrappedString

那我到底什麼時候會用到 ! 這種危險的東西?

最經典的場景,就是在 iOS 開發中連接畫面元件用的 IBOutlet。

class MyViewController: UIViewController {
    @IBOutlet weak var lbTitle: UILabel! // 就是這裡!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 當 viewDidLoad 執行時,iOS 系統保證 lbTitle 已經和畫面上的標籤元件連接好。
        // 所以我們 100% 確定它此時一定有值,可以直接使用它,省去解包的麻煩。
        lbTitle.text = "歡迎光臨!"
    }
}

為了徹底搞懂,我們把三種角色請出來比較一下(範例使用字串 String 型別):

var name: String   // 一般變數
var name: String?  // 可選型別 Optional
var name: String!  // 隱式解析可選型別 Implicitly Unwrapped Optional
特性 String (一般型別) String? (可選型別) String! (隱式解析可選型別)
宣告語法 let name: String let name: String? let name: String!
核心概念 保證有值 可能有值,可能為 nil 現在可能為 nil,但你保證在用它之前一定會有值
能否為 nil 否,絕對不行 (這是關鍵!)
使用方式 直接使用 name 需安全解包後才能用 (if let, guard let) 可直接使用 name (系統自動幫你強制解包)
安全性 編譯時期安全 編譯時期安全 執行時期風險 (Runtime Risk)
潛在後果 安全 安全,編譯器會保護你 如果值為 nil 時使用,App 會崩潰!

小結一下

今天我們掌握了處理「nil 值」的關鍵技巧!你學會了如何使用「可選型別 (Optional)」來安全地表示可能不存在的資料。更重要的是,你學會了如何像拆包裹一樣,使用 if let 安全地解包,也理解了何時以及為何要小心使用帶有風險的強制解包 !。這些都是避免 App 閃退的必備技能!

🌟 明天預告

當我們在寫程式時,想加總數字、比較大小、控制條件邏輯,這時候都會用到一樣強大的工具:運算子(Operators)!

Swift 不只提供基本的加減乘除,還有邏輯運算、比較運算與進階的複合運算符號,幫你用簡單語法完成複雜的判斷與操作。

明天,我們就要一探 Swift 運算子的全貌,從最基礎的算術開始,帶你邁向寫程式的解題高手之路!

敬請期待《Day 4|Swift 運算子全攻略:從加減乘除到邏輯推理,寫程式就像解題!》


上一篇
Day 2|Swift 資料存放密技:變數、常數與基本型別一次搞懂!
下一篇
Day 4|Swift 運算子全攻略:從加減乘除到邏輯推理,寫程式就像解題!
系列文
Swift iOS 開發新手村:從入門到 AI 聊天室6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言