# 一次搞懂 Optional in Swift
###### tags: `想知道嗎`
---
## What is optional?
- 任何型別加上 "?" 即為 Optional 型別
- Optional
- 有值
- 空值 (nil)
- Int ≠ Int?, String ≠ String?...
---
## Why optional?
- Swift 是強型別的語言
- 設置變數只會出現以下兩種狀況:
1. 給定初始值
```swift
var number: Int = 0
```
2. 設定為 optional 型別
```swift
var number: Int?
```
---
Optional 的狀態可想成將變數包裝起來,在未拆開前,並不知道裡面是有值或是空值的狀態。
---
## 解包 (Unwrapping)
當我們需要使用 optional 時就必須拆開包裝,實際的做法有三種:
1. 強制解包 "!"
2. if 解包
3. if let / guard let 解包
---
### 強制解包 "!"
```swift
var number: Int?
number = 10
print(number!)
// Prints 10
```
---
### if 解包
方法一:
```swift
var number: Int?
number = 10
if number != nil {
print("The number is \(number!).")
// Prints "The number is 10."
}
```
方法二:
```swift
var number: Int?
number = 10
if number != nil {
let newNumber = number
print("The number is \(newNumber).")
// Prints "The number is 10."
}
```
---
### if let / guard let 解包
if let:
```swift
var number: Int?
number = 10
if let newNumber = number {
print("The number is \(newNumber).")
// Prints "The number is 10."
}
```
guard let:
```swift
func showNumber(_ number: Int?) {
guard let newNumber = number else { return }
print("The number is \(newNumber).")
}
showNumber(10)
// Prints "The number is 10."
```