5月27日 11:52

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 }
标签:Swift