一、为什么条件语句是 Swift 的基础
条件语句决定了程序在不同情况下走哪条分支。Swift 在继承 C 系语言 if、switch 语法的基础上,做了大量安全性改进:条件必须是真正的布尔表达式、switch 默认不穿透、支持区间匹配和值绑定等。掌握这些特性,能写出更简洁、更不容易出错的 Swift 代码。
本文会依次讲解 if、if-else、else if、guard、switch、where 子句以及三元运算符,并给出可直接运行的示例。
二、if 语句
Swift 的 if 条件必须是 Bool 类型,不能像 C 那样用整数或对象隐式判断真假。
swift
let temperature = 28
if temperature > 25 {
print("天气偏热,注意防暑")
}
下面这种写法在 Swift 中会直接编译报错,因为 1 不是布尔值:
swift
// 编译错误:'Int' is not convertible to 'Bool'
// if 1 {
// print("不会执行")
// }
条件表达式两侧的圆括号可以省略,但花括号不能省略,即使只有一行代码。
三、if-else 与 else if
当需要在多个互斥分支中选择一个时,使用 if-else 或 else if 链。
swift
let score = 86
if score >= 90 {
print("优秀")
} else if score >= 80 {
print("良好")
} else if score >= 60 {
print("及格")
} else {
print("不及格")
}
// 输出:良好
分支从上到下依次判断,一旦某个条件成立,后续分支不再执行。因此条件顺序很重要,通常把更严格的条件放在前面。
四、可选绑定与 if let
Swift 中处理可选值最常用的方式之一,是在 if 中做可选绑定。
swift
let nickname: String? = "小明"
if let name = nickname {
print("昵称是 \(name)")
} else {
print("没有设置昵称")
}
// 输出:昵称是小明
Swift 5.7 起支持简写形式,绑定变量名与可选变量同名时可以省略等号右侧:
swift
if let nickname {
print("昵称是 \(nickname)")
}
多个可选值可以串联绑定,任意一个为 nil 则整个条件不成立:
swift
let username: String? = "admin"
let password: String? = "123456"
if let username, let password, !username.isEmpty, !password.isEmpty {
print("登录参数有效")
}
五、guard 语句:提前退出
guard 用于在条件不满足时提前退出当前作用域,让主逻辑保持在更浅的缩进层级。它必须配合 return、break、continue、throw 或 fatalError() 使用。
swift
func greet(user: String?) {
guard let user, !user.isEmpty else {
print("用户名无效")
return
}
print("你好,\(user)")
}
greet(user: "Alice") // 输出:你好,Alice
greet(user: nil) // 输出:用户名无效
与 if let 相比,guard let 绑定出的变量在 guard 之后的整个作用域内都可用,适合做参数校验和前置条件检查。
六、switch 语句
Swift 的 switch 比 C 系语言强大得多,且默认不会贯穿到下一个分支,因此不需要写 break。
swift
let grade = "B"
switch grade {
case "A":
print("优秀")
case "B":
print("良好")
case "C":
print("及格")
default:
print("未知等级")
}
// 输出:良好
switch 必须覆盖所有可能情况,否则需要提供 default 分支。
6.1 区间匹配
swift
let age = 17
switch age {
case 0..<6:
print("学龄前")
case 6..<12:
print("小学")
case 12..<18:
print("中学")
default:
print("成年")
}
// 输出:中学
6.2 元组匹配
swift
let point = (1, 1)
switch point {
case (0, 0):
print("原点")
case (_, 0):
print("在 x 轴上")
case (0, _):
print("在 y 轴上")
case let (x, y) where x == y:
print("在对角线上:\(x), \(y)")
default:
print("普通点")
}
// 输出:在对角线上:1, 1
6.3 值绑定与 where 子句
swift
let numbers = [3, 8, 15, 22]
for number in numbers {
switch number {
case let n where n % 2 == 0:
print("\(n) 是偶数")
default:
print("\(n) 是奇数")
}
}
6.4 复合 case 与 fallthrough
多个值可以写在同一个 case 中,用逗号分隔。如果确实需要贯穿到下一个分支,使用 fallthrough。
swift
let character: Character = "a"
switch character {
case "a", "e", "i", "o", "u":
print("元音字母")
default:
print("辅音字母")
}
let level = 1
switch level {
case 1:
print("新手")
fallthrough
case 2:
print("可领取新手礼包")
default:
break
}
// 输出:新手
// 输出:可领取新手礼包
七、三元条件运算符
对于简单的二选一赋值,三元运算符能让代码更紧凑:
swift
let isLogin = true
let tip = isLogin ? "欢迎回来" : "请先登录"
print(tip) // 输出:欢迎回来
三元表达式不宜嵌套过深,超过两层建议改回 if-else,以保证可读性。
八、常见注意事项
- 条件必须是 Bool:Swift 不允许把整数、字符串或可选值直接当作条件。
- switch 不穿透 :每个
case执行完自动结束,需要贯穿时显式写fallthrough。 - case 不能为空 :如果某个分支暂时不需要处理,写
break占位。 - guard 必须退出 :
guard的else块必须以控制转移语句结束。 - 优先使用 guard 做前置校验:能减少嵌套层级,让主流程更清晰。
九、小结
Swift 的条件语句在保持语法简洁的同时,通过强制布尔条件、默认不穿透的 switch、区间与元组匹配、guard 提前退出等机制,显著降低了出错概率。日常开发中,简单分支用 if-else,参数校验用 guard,多值枚举或模式匹配用 switch,就能覆盖绝大多数场景。