Swift 条件语句详解:从 if 到 switch 的完整指南

一、为什么条件语句是 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,就能覆盖绝大多数场景。

相关推荐
吴可可12322 分钟前
ActiveX调用WScript.Shell原理揭秘
开发语言
晴天的雨.9921 小时前
【C++】继承篇
java·开发语言·c++
SomeOtherTime2 小时前
第 1 讲:内存布局与所有权解剖——栈帧、胖指针与“移动/拷贝”在汇编层面的真实面目
java·开发语言·汇编
总要学点什么2 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
大可不必了13 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道14 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛14 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
eggwyw15 小时前
Anaconda安装卸载的详细流程指南
开发语言·python