使用 guard let 提前退出
解包失败时提前退出,减少嵌套。
使用 guard let 提前退出 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
guard 的作用
guard 会检查条件;如果条件不满足,就退出当前作用域。它专门用于提前退出,让正常路径无需增加缩进。
func greet(_ name: String?) {
guard let name else {
print("No name")
return
}
print("Hello, \(name)")
}
greet("Ada")
greet(nil)guard let 语法
写成 guard let value = optional else { return }。与 if let 不同,已解包的值在 guard 之后仍处于作用域内。
func double(_ text: String) {
guard let n = Int(text) else {
print("Not a number")
return
}
print(n * 2)
}
double("8")
double("x")值在之后仍可用
由于 guard 在失败时退出,编译器可以确定该值之后一定存在。您可以在函数的剩余部分正常使用它。
func length(of text: String?) {
guard let text else { return }
let count = text.count
print(count)
}
length("hello")else 分支必须退出
守护语句的 else 代码块必须离开当前作用域:使用 return、break、continue 或 throw。编译器会强制执行这一要求。
func process(_ value: Int?) {
guard let value else {
return
}
print("Processing \(value)")
}
process(99)guard let 的简写形式
和 if let 一样,guard 也支持简写:当名称相同时,可以写成 guard let name else { ... }。
func show(_ name: String?) {
guard let name else {
print("missing")
return
}
print(name)
}
show("Kai")扁平的正常路径
guard 最大的优势是让正常路径保持扁平且易读。请比较嵌套的 if let 金字塔结构和一系列守护语句。
func register(name: String?, age: Int?) {
guard let name else { return }
guard let age else { return }
print("\(name) is \(age)")
}
register(name: "Mia", age: 28)守护普通条件
guard 可以处理任何布尔条件,而不仅仅是可选值。guard count > 0 else { return } 会提前退出。
func divide(_ a: Int, by b: Int) {
guard b != 0 else {
print("Cannot divide by zero")
return
}
print(a / b)
}
divide(10, by: 2)
divide(10, by: 0)循环中的守护语句
在循环内部,当数据缺失时,守护语句可以使用 continue 跳过本次迭代。
let inputs = ["1", "x", "3"]
for item in inputs {
guard let n = Int(item) else { continue }
print(n * 10)
}一个守护语句中的多个绑定
一个守护语句可以解包多个可选值,只需用逗号分隔。所有绑定都成功后才能继续执行。
func combine(_ a: String?, _ b: String?) {
guard let a, let b else { return }
print(a + b)
}
combine("foo", "bar")使用类似 where 的检查进行守护
您可以在绑定后用逗号添加布尔条件,以进一步限定守护语句通过的情况。
func validate(_ text: String?) {
guard let text, !text.isEmpty else {
print("invalid")
return
}
print("ok: \(text)")
}
validate("")
validate("hi")何时选择 guard
在函数开头需要检查前置条件时使用 guard;如果只需在某个分支内短暂使用该值,则使用 if let。
func area(width: Int?, height: Int?) -> Int {
guard let width, let height else { return 0 }
return width * height
}
print(area(width: 3, height: 4))快速检查
测试 guard let。
回顾:使用 guard let 提前退出
guard let value else { return } 会解包一个可选值,并让该值在后续作用域中可用。它的 else 代码块必须退出,从而使正常路径保持扁平且易读。
func f(_ x: Int?) {
guard let x else { return }
print(x)
}
f(5)常见问题解答
「使用 guard let 提前退出」课时是免费的吗?
是的 — 「使用 guard let 提前退出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 guard let 提前退出」这节课中我会学到什么?
解包失败时提前退出,减少嵌套。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 guard let 提前退出」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- if let 与简写绑定
- 使用 guard let 提前退出
- 绑定多个可选值
- switch 与 for 中的可选模式