昨天我們學會了變數、資料型別與字串插值,已經能讓程式和我們互動。
但現實世界中,有時候資料並不一定會出現,比如使用者還沒填寫名字、伺服器還沒回來資料...
這時候,我們就得學會 Swift 中超級重要的觀念:可選型別(Optional)!
在 Swift 裡,一個值「可能存在,也可能為空 (nil)」的變數,就稱為 可選型別 (Optional),我們在型別後面加上問號 ?
來宣告它。
var score: Int? = nil
score = 80
因為 Optional 變數有可能是空的,直接使用會有風險。
所以,我們要像「打開包裹」一樣先確認裡面到底有沒有值,這個動作就稱為 解包 (unwrap)。
最安全也最常見的解包方法就是 if let
。
它會嘗試解包,只有在裡面真的有值的時候,才會執行 {}
裡面的程式碼:
if let realScore = score {
print("你的分數是 \(realScore)")
} else {
print("分數還沒出來哦!")
}
這樣寫能 100% 避免因 nil
造成的閃退,是處理 Optional 的首選方式!
當你非常確定一個可選型別(Optional)裡面一定有值的時候,可以使用強制解析(forced unwrapping),直接在變數名稱後面加上一個驚嘆號 !
,直接取出變數中的值來做使用:
let number3: Int? = 500 // 可選整數,有值500
print(number3!) // 強制解析,直接使用裡面的500
不過要注意的是,如果對一個目前是 nil
的可選型別使用強制解析,就會直接造成程式錯誤:
var number4: Int? // 尚未賦值,預設是 nil
// print(number4!) // 如果執行這行會造成錯誤,因為沒有值
它本質上是可選型別,但你向編譯器做出一個承諾:「我保證,在存取這個變數的任何時候,它的值都絕對不會是 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 運算子全攻略:從加減乘除到邏輯推理,寫程式就像解題!》