0Pricing
Swift Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. if let 与简写绑定
  2. 使用 guard let 提前退出
  3. 绑定多个可选值
  4. switch 与 for 中的可选模式
← 返回 Swift Academy