Optional 的几种使用方式
1. 普通 Optional(Optional Type)
javascript
var name: String?
- 官方名称:Optional
- 推荐默认使用
2. 强制解包(Force Unwrapping)
bash
let name: String? = "Tom"
print(name!)
- 官方名称:Force Unwrapping
- 使用
! - nil → crash
❌ 不推荐滥用
3. 可选绑定(Optional Binding)
bash
if let name = name {
print(name)
}
或:
swift
guard let name = name else { return }
- 官方名称:Optional Binding
- 安全解包
- ⭐ 最推荐方式
4. 可选链(Optional Chaining)
person?.address?.street
- 官方名称:Optional Chaining
- 任意一层 nil → 整体为 nil
- 安全访问链式调用
5. Nil 合并运算符(Nil-Coalescing Operator)
ini
let name = input ?? "Default"
- 官方名称:Nil-Coalescing Operator
- 提供默认值
T! 是什么?
javascript
var name: String!
👉 官方名称:
Implicitly Unwrapped Optional
本质
vbnet
Optional<String>
👉 本质仍然是 Optional,但带自动解包行为
行为
dart
var name: String! = "Tom"
print(name) // 不需要 !
但如果name实际为 nil时,则会触发解包失败crash:
go
var name: String! = nil
print(name) // 💥 crash
使用场景
1. Objective-C 互操作(Objective-C Bridging)
less
@property NSString *name;
→ Swift:
javascript
var name: String!
2. 延迟初始化(Delayed Initialization)
典型:IBOutlet
swift
@IBOutlet weak var label: UILabel!
风险
- 看起来像非 Optional
- 实际是 Optional
- nil 时直接 crash
👉 本质:危险语法糖
总结对照表
| 写法 | 英文名称 | 安全性 | 建议 |
|---|---|---|---|
String? |
Optional | ✅ | 默认使用 |
name! |
Force Unwrapping | ❌ | 尽量避免 |
if let / guard let |
Optional Binding | ✅ | ⭐推荐 |
?. |
Optional Chaining | ✅ | 常用 |
?? |
Nil-Coalescing Operator | ✅ | 常用 |
String! |
Implicitly Unwrapped Optional | ⚠️ | 限定场景 |