可选值的空值合并与三元运算
使用 ?? 提供默认值,并链接空值合并运算符
可选值的空值合并与三元运算 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
nil 合并运算符 `??` 会在可选值为 nil 时提供默认值。将它与三元运算符结合使用,可以简洁而清晰地处理可选值。
?? 运算符
```swift
let name: String? = nil
let display = name ?? "Guest"
print(display) // "Guest"
let known: String? = "Alice"
print(known ?? "Guest") // "Alice"
```
如果可选值不为 nil,则使用其中解包后的值;否则使用默认值。
短路求值
`??` 的右侧只会在左侧为 nil 时求值:
```swift
func expensiveDefault() -> String {
print("Computing...")
return "Default"
}
let val: String? = "Existing"
let result = val ?? expensiveDefault() // expensiveDefault not called
```
链接 ??
链接多个 `??` 运算符,即可依次尝试多个备用值:
```swift
let primary: String? = nil
let secondary: String? = nil
let fallback = "Anonymous"
let user = primary ?? secondary ?? fallback
print(user) // "Anonymous"
```
求值会在遇到第一个非 nil 值时停止。
?? 与计算属性
```swift
struct Config {
var theme: String?
var displayTheme: String { theme ?? "light" }
}
var c = Config()
print(c.displayTheme) // "light"
c.theme = "dark"
print(c.displayTheme) // "dark"
```
这是在计算属性中提供默认值的一种简洁模式。
可选值与三元运算符
三元表达式 `condition ? a : b` 可以与可选值检查结合使用:
```swift
let score: Int? = 85
let label = score != nil ? "\(score!)" : "No score"
```
但通常使用 `??` 更简洁:
```swift
let label = score.map { "\($0)" } ?? "No score"
```
使用 Optional.map 进行转换
无需解包即可转换可选值所包装的值:
```swift
let maybeInt: Int? = 42
let maybeStr = maybeInt.map { "Value: \($0)" }
// Optional("Value: 42")
let nilInt: Int? = nil
let nilStr = nilInt.map { "Value: \($0)" }
// nil
```
使用 flatMap 进行可选值链式处理
当转换操作本身返回可选值时,请使用 `flatMap`:
```swift
let str: String? = "123"
let num = str.flatMap { Int($0) } // Optional(123)
let bad: String? = "abc"
let nil2 = bad.flatMap { Int($0) } // nil
```
??= 赋值运算符(非内置)
Swift 没有内置的 `??=`,但您可以模拟它:
```swift
var cache: [String: Int] = [:]
// Assign only if nil:
if cache["key"] == nil {
cache["key"] = expensiveCompute()
}
// Or with a helper:
func ??= (lhs: inout T?, rhs: @autoclosure () -> T) {
if lhs == nil { lhs = rhs() }
}
```
可读性指南
选择合适的工具:
• `??`——简单的默认值
• `if let`——需要在多条语句中使用解包后的值
• `guard let`——前置条件检查与提前退出
• `.map` / `.flatMap`——无需解包即可进行转换
除非 nil 情况确实不可能发生,否则应避免使用 `!` 强制解包。
快速检查
当 `optional` 为 `nil` 时,`optional ?? default` 会返回什么?
回顾
要点:
• `a ?? b`——如果 `a` 不为 nil,则返回 `a` 的值;否则返回 `b`
• 具有短路特性:只有当 `a` 为 nil 时才会对 `b` 求值
• 可以链接:`a ?? b ?? c`
• `.map` 转换包装的值;`.flatMap` 处理转换结果为可选值的情况
• 优先使用 `??`,而不是三元运算符加强制解包
下一节:使用 `?.` 进行可选值链式调用
常见问题解答
「可选值的空值合并与三元运算」课时是免费的吗?
是的 — 「可选值的空值合并与三元运算」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「可选值的空值合并与三元运算」这节课中我会学到什么?
使用 ?? 提供默认值,并链接空值合并运算符 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「可选值的空值合并与三元运算」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- if let 与 guard let 绑定
- 可选值的空值合并与三元运算
- 可选链 ?. 运算符
- 隐式解包可选值及应避免使用的情况