在 Swift 和 SwiftUI 中,guard 是一种控制流语句,用于提前退出当前代码块(如函数、方法或循环),以确保某些条件成立。如果条件不满足,guard 会执行一个退出操作(如 return、break 或 continue)。这是 Swift 的一种安全编程模式,通常用于简化代码的逻辑层次。
guard 的基本语法
guard 条件 else {
// 条件不满足时执行的代码
退出当前代码块
}
条件: guard 需要一个返回 Bool 的表达式。
退出操作: 必须使用 return、break、continue 或 fatalError() 等语句退出当前代码块。
典型使用场景
1、提前校验条件:
使用 guard 提前检查输入参数、数据状态等,避免深层嵌套。
func divide(a: Double?, b: Double?) -> Double? {
guard let a = a, let b = b, b != 0 else {
print("Invalid input: a or b is nil, or b is zero.")
return nil
}
return a / b
}
2、校验绑定值:
使用 guard 和可选绑定检查非空值。
func printName(name: String?) {
guard let name = name else {
print("Name is nil.")
return
}
print("Hello, \(name)!")
}
3、循环中提前退出:
for number in [1, 2, nil, 4, nil] {
guard let number = number else {
print("Encountered a nil value, skipping.")
continue
}
print("Number is \(number)")
}
4、限制用户输入:
func updateTargetAmount(input: String?) {
guard let input = input, let amount = Double(input), amount > 0 else {
print("Invalid input.")
return
}
print("Valid amount: \(amount)")
}
guard 与 if 的对比
示例对比
guard 实现:
func validate(input: Int?) {
guard let input = input, input > 0 else {
print("Invalid input.")
return
}
print("Valid input: \(input)")
}
if实现:
func validate(input: Int?) {
if let input = input, input > 0 {
print("Valid input: \(input)")
} else {
print("Invalid input.")
}
}
在 SwiftUI 中使用 guard
在 SwiftUI 中,guard 可以用来确保状态或数据满足条件,否则提前返回,比如在视图的逻辑处理或数据加载中。
使用示例
1、校验用户输入
Button("Submit") {
guard !textInput.isEmpty else {
showAlert = true
return
}
print("Submitted: \(textInput)")
}
2、可选数据绑定
struct ContentView: View {
@State private var number: Int? = 10
var body: some View {
VStack {
if let number = number {
Text("Number is \(number)")
} else {
Text("Number is nil")
}
Button("Clear Number") {
number = nil
}
Button("Update Number") {
guard let newNumber = Int.random(in: 1...100) as Int? else {
print("Invalid number.")
return
}
number = newNumber
}
}
}
}
总结
guard 是 Swift 中的一种关键控制流语句,常用于提前校验条件。
在 SwiftUI 中,guard 可以帮助处理用户输入、状态检查等逻辑,提升代码可读性和安全性。
选择使用 guard 或 if 取决于具体需求,但在需要提前退出时,guard 是更优雅的选择。