在 Swift 中,?? 是 空合并运算符(Nil-Coalescing Operator) 。它的作用是对一个可选类型(Optional)的值进行解包,如果可选值为 nil,则提供一个默认值。
基本语法
swift
let result = optionalValue ?? defaultValue
- 如果
optionalValue不是nil,则返回解包后的值。 - 如果
optionalValue是nil,则返回defaultValue。
示例
swift
let name: String? = nil
let unwrappedName = name ?? "Unknown"
print(unwrappedName) // 输出: "Unknown"(因为 name 是 nil)
swift
let age: Int? = 25
let unwrappedAge = age ?? 0
print(unwrappedAge) // 输出: 25(因为 age 不是 nil)
等价写法
a ?? b 实际上是以下代码的简写:
swift
a != nil ? a! : b
即:如果 a 不是 nil,则强制解包(a!),否则返回 b。
特点
- 短路求值 :如果可选值非
nil,则不会计算defaultValue。 - 类型匹配 :
defaultValue的类型必须和可选值的解包类型一致。
链式使用
可以连续使用 ?? 提供多个备选值:
swift
let first: String? = nil
let second: String? = nil
let output = first ?? second ?? "No value"
print(output) // 输出: "No value"
常见用途
- 安全解包可选值,避免强制解包(
!)导致的崩溃。 - 为缺失的数据提供默认值(如网络请求、用户输入等场景)。
对比其他解包方式
| 方式 | 行为 |
|---|---|
let x = optional! |
强制解包(若 nil 会崩溃) |
if let x = optional { ... } |
条件解包(仅在非 nil 时执行) |
guard let x = optional else { ... } |
提前返回解包(用于错误处理) |
let x = optional ?? defaultValue |
提供默认值(最简洁的安全解包) |
总结:?? 是 Swift 中处理可选类型的一种简洁、安全的方式,能有效减少代码中的 nil 检查逻辑。