Swift guard 语句怎么用?和 if let 有什么区别?
guard 在条件不满足时提前退出,减少嵌套。核心规则:guard 的 else 块必须终止当前作用域(return/break/continue/throw),条件满足时绑定的变量在后续代码中可用——这是和 if let 最大的区别。
guard 让代码从上到下读——"先验证条件,不满足就走人,满足就继续"。比 if-else 的金字塔嵌套清晰得多。
追问
guard let 和 if let 有什么区别?
if let 解包后变量只在 if 块内可用,guard let 解包后变量在 guard 之后的整个作用域可用。所以 guard 更适合"验证后继续用"的场景,if let 更适合"有值就处理,没有就不处理"的场景。函数参数验证几乎都用 guard——提前 return,主逻辑不需要嵌套在 if 里。
guard 可以配合多个条件吗?
可以,用逗号分隔:guard let name = name, !name.isEmpty, name.count < 50 else { return }。逗号是"且"的关系——所有条件都满足才继续。也支持 where 子句:guard let age = age where age >= 18(Swift 3 之后改用逗号语法)。
guard 在循环里怎么用?
循环里 guard 的 else 块用 continue(跳过当前迭代)或 break(退出循环)。常见模式:遍历数组时跳过不符合条件的元素。比在循环体里嵌套 if 更清晰——"不符合就跳过,符合才处理"。
guard 能用于可选链吗?
不能直接用。guard let x = obj?.property 编译不过——可选链返回的是 Optional,guard let 需要完整解包。正确做法:先解包 obj,再访问 property。或者用 if let + 可选链处理多层嵌套的可选值。
guard 有什么性能影响?
没有。guard 在编译后和 if-else 一样,只是语法糖。编译器不会因为 guard 生成额外代码。选择 guard 纯粹是为了可读性——代码意图更清晰,减少嵌套。
写段代码
swift// guard let: 解包后后续可用 func process(user: User?) { guard let user = user else { return } print(user.name) // user 在这里可用 } // 多条件 guard func register(name: String?, age: Int?) { guard let name = name, !name.isEmpty else { return } guard let age = age, age >= 18 else { return } print("Registered: \(name), \(age)") } // 循环中用 continue let items: [Int?] = [1, nil, 3, nil, 5] for item in items { guard let value = item else { continue } print(value) // 只打印 1, 3, 5 } // guard + throw func divide(_ a: Int, by b: Int) throws -> Int { guard b != 0 else { throw DivisionError.zero } return a / b }