首页 / Swift 编程语言教程 / 运算符(二)

Swift 编程语言教程

运算符(二)

本教程共 93 篇 · 第 14 篇 · 更新于 2026-08-08 · 约 8 分钟阅读

SwiftSwift 编程语言教程比较运算符逻辑运算符三元运算符区间运算符

本节目标:读完你能用比较和逻辑运算符写出条件判断,用三元运算符精简二选一,用区间运算符表达一段连续的值。

上一章是算数,这一章的运算符主要干”判断”的活:比大小、拼逻辑、二选一、划范围。它们是你写 if 和各种控制流时的常客。

1-1 比较运算符

比较运算符都返回布尔值(true/false),告诉你”成不成立”:

1 == 1   // true,相等
2 != 1   // true,不等
2 > 1    // true,大于
1 < 2    // true,小于
1 >= 1   // true,大于等于
2 <= 1   // false,小于等于

这组符号和数学里几乎一样,只有”相等”写成 ==、“不等”写成 != 要注意——别忘了 = 是赋值,== 才是比较,这是新手最高频的笔误来源。

1-2 比较运算符去哪用

它们最常被放进条件语句。比如判断名字是不是目标用户:

let name = "世界"
if name == "世界" {
    print("你好,世界")
} else {
    print("我不认识你")
}

Swift 的比较结果就是 Bool,正好喂给 if。后面学流程控制时,这会成为你的日常写法。

1-3 元组也能比较

如果两个元组类型相同、元素个数相同,可以直接用 <== 等比较。比较规则是”从左到右逐个比,先分出胜负的那一对决定结果”:

(1, "斑马") < (2, "苹果")   // true:第一项 1<2 已定胜负
(3, "苹果") < (3, "鸟")     // true:第一项相等,比第二项
(4, "狗") == (4, "狗")      // true:全部相等

只要元组里每个元素自身支持该运算符,整体就能比。标准库内置了少于 7 个元素的元组比较;7 个及以上要自己实现。

1-4 逻辑运算符

逻辑运算符操作 Bool 值,有三种:

逻辑非 !a:把 true 变 false、false 变 true。

let allowed = false
if !allowed {
    print("拒绝进入")
}

逻辑与 a && b:两边都得是 true,整体才 true。

if enteredDoor && passedScan {
    print("欢迎")
}

逻辑或 a || b:只要有一边是 true,整体就 true。

if hasKey || knowsPassword {
    print("欢迎")
}

1-5 短路求值很重要

&&|| 都有”短路”特性:能定胜负时,后面的就不再算了。

&&,只要左边是 false,右边根本不求值——反正结果已定是 false。对 ||,只要左边是 true,右边也不算。

这个特性不只是性能优化,还关乎正确。比如 if list.count > 0 && list[0] > 5,若 list 为空,左边 false,右边的 list[0] 不会被访问,从而避免了越界崩溃。写复杂条件时,把”便宜且易失败”的判断放左边,更安全。

1-6 三元条件运算符

三元运算符是唯一的三元运算符,形式 问题 ? 答案1 : 答案2:问题为 true 取答案1,否则取答案2。

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// 有表头加 50,结果是 90

它等价于一段 if-else,但能写在一行,适合”二选一算个值”的场景。官方提醒:别贪用,嵌套多个三元会让代码难读。一个就清爽,两个以上建议改回 if-else

1-7 区间运算符

区间运算符是 Swift 的便利发明,用 .....< 表达一段连续值。

闭区间 a...b:从 a 到 b,两端都包含。

for index in 1...5 {
    print(index)
}
// 打印 1 2 3 4 5

半开区间 a..<b:含 a 不含 b,常用于从 0 数到数组长度(数组下标从 0 开始):

let names = ["Anna", "Alex", "Brian", "Jack"]
for i in 0..<names.count {
    print("第 \(i + 1) 位是 \(names[i])")
}

1-8 单侧区间

区间还能只写一边,表示”延伸到头”。比如取数组从下标 2 到末尾:

for name in names[2...] {
    print(name)
}
// Brian、Jack

...2 表示从头到 2,..<2 表示从头到 1(不含 2)。单侧区间也能用在判断”是否包含某值”上:let r = ...5; r.contains(3) 为 true。

Tip

写条件时如果逻辑长,适当加括号让意图清楚,哪怕语法上不需要。if (a && b) || c || d 比一堆 &&/|| 挤一起好读。可读性永远优先于少打几个字符。

1-9 条件运算符怎么用

比较和逻辑运算符是 if 等条件判断的食材,用熟它们,流程控制那章会轻松很多。先说比较:== 相等、!= 不等、> < >= <= 大小,返回都是 Bool。最高频笔误是把赋值 = 写成比较——记住单等赋值、双等比较。

元组也能比大小,规则是”从左到右逐个比,先分胜负的那对定结果”。这很方便,但标准库只内置少于 7 个元素的元组比较,更多元素要自己实现,日常里极少遇到,知道有这限制即可。

逻辑运算符 !&&|| 拼布尔值。重点理解”短路求值”:&& 左边 false 就不算右边,|| 左边 true 就不算右边。这个特性不只是性能,更关乎正确——if list.count > 0 && list[0] > 5 在空列表时左边 false,右边不会被访问,从而避免越界崩溃。把”便宜且易失败”的判断放左边,更安全。

三元 ? : 适合一行二选一,但别嵌套多个,否则难读。区间 ... 含两端、..< 不含右端,单侧区间能延伸到头。这些是循环和切片的好搭档,下一模块流程控制里会频繁出场。

写复杂逻辑时,适当加括号让意图清楚,哪怕语法上不需要。if (a && b) || c || d 比一堆 &&/|| 挤一起好读。可读性优先于少打字符,这是写条件的老规矩。还有一点:别用 &&/|| 把三四个条件揉成一行巨长表达式。拆成有意义的子条件或加括号,读起来才不费劲。运算符是工具,清晰地使用它,才是真本事。

1-10 补记:更多例子巩固

补几条例子帮助巩固。三元运算符常用于”根据条件选默认值”:let bg = isDark ? "黑" : "白"。逻辑运算组合时,把最可能为 false(对 &&)或最可能为 true(对 ||)的条件放前面,能借助短路尽早结束,既快又安全。区间运算符和 for 循环是绝配:for i in 0..<n 遍历前 n 个下标,比手写 i < n 更不容易越界。

另外提醒,比较运算符也能直接用在 while 等循环条件里,不只是 if。元组比较在写”按多字段排序”的自定义比较时很省事,但要记得标准库只对少于 7 个元素的元组内置比较。把比较、逻辑、三元、区间这四类运算符玩熟,流程控制的代码会写得又短又准。

陷阱再强调一次:别把 === 用,这是所有语言转换者的最高频错误。Swift 虽能用类型系统拦下不少,但书写习惯才是根本防线。写完条件表达式,扫一眼等号个数,能省一次尴尬的调试。

1-11 小结

比较运算符(==!=><>=<=)返回 Bool,是 if 的食材;元组也能比,按元素从左到右定胜负。逻辑运算符 !&&|| 有短路特性,要善用它避免越界。三元 ? : 适合一行二选一。区间 .....< 表达连续值,单侧区间可延伸到头。下一章我们专门讲字符串的日常操作:拼接、插值、多行。