Swift 运算符
运算符是程序里"操作数据"的符号。Swift 的运算符分为:算术、复合赋值、比较、逻辑、范围、空合并、位、溢出等几类。本章一一讲清楚,并特别强调 Swift 独有的范围运算符和空合并运算符。
1. 算术运算符
// 基本算术:+ - * /
let a = 10, b = 3
print(a + b) // 13
print(a - b) // 7
print(a * b) // 30
print(a / b) // 3(整数除法,直接截断小数)
print(a % b) // 1(取余)
// 浮点除法:只要有一个是 Double 就是 Double
print(10.0 / 3) // 3.3333...
// 一元负号、正号
let positive = +5
let negative = -positive注意整数除法:10 / 3 等于 3(直接截断小数)。要小数,至少有一边写成 10.0。这个细节新手很容易踩坑。
2. 复合赋值运算符
// 复合赋值运算符:+= -= *= /= %=
var score = 100
score += 20 // 等价 score = score + 20
score -= 10 // 90 -> 110 -> 100 -> 120 -> 110...
score *= 2 // 220
score /= 3 // 73
score %= 5 // 3
print(score) // 3
// 注意:Swift 没有 ++ 和 --(从 Swift 3 起被移除)
// 写成 += 1 / -= 1注意 Swift 没有 ++ 和 --——Swift 3 起被移除,理由是它们有多种用法(前置/后置)容易出错。统一写成 += 1 和 -= 1。
3. 比较运算符
// 比较运算符:返回 Bool
let a = 5, b = 10
print(a == b) // false
print(a != b) // true
print(a > b) // false
print(a < b) // true
print(a >= 5) // true
print(a <= 5) // true
// 字符串、元组也能比较
print("abc" < "abd") // true(字典序)
print((1, 2) < (1, 3)) // true(逐元素比较)
// 同类型才能比较,Swift 不会自动转换
// 5 == 5.0 // 编译错误:类型不同
print(5 == Int(5.0)) // trueSwift 的比较运算符返回 Bool。它还能直接比较字符串、元组(逐元素比)。但不同类型不能直接比较——5 == 5.0 是编译错误,要先转换类型。
4. 逻辑运算符
// 逻辑运算符:&& || !
let isVip = true
let hasPaid = false
// 与(and):两个都真才真
print(isVip && hasPaid) // false
// 或(or):一个真就是真
print(isVip || hasPaid) // true
// 非(not):取反
print(!isVip) // false
// 短路特性:&& 左边为 false 不算右边;|| 左边为 true 不算右边
let x = 0
if x > 0 && 10 / x > 1 { } // 不会触发除零
// 推荐用括号明确意图
let ok = (isVip || hasPaid) && !false三个运算符都是双目(除了 !),返回 Bool。具有短路特性:&& 左边为 false 就不算右边,|| 左边为 true 就不算右边——这点可以用来避免除零或解包 nil。
5. 范围运算符(Swift 特色)
Swift 有三种范围运算符,这是其他语言少有的便捷:
- 闭范围
a...b:包含 a 和 b,常用于 for-in。 - 半开范围
a..<b:包含 a,不包含 b,常用于数组下标(0 到 count-1)。 - 单侧范围
...和..<:省略一端,用于切片。
// 范围运算符:Swift 的特色
// 闭范围 a...b 包含 a 和 b
for i in 1...5 {
print(i) // 1 2 3 4 5
}
// 半开范围 a..<b 包含 a 不包含 b
for i in 0..<3 {
print(i) // 0 1 2
}
// 单侧范围:用于数组切片
let arr = [10, 20, 30, 40, 50]
print(arr[2...]) // [30, 40, 50](从下标 2 到末尾)
print(arr[...2]) // [10, 20, 30](从头到下标 2)
print(arr[..<2]) // [10, 20](从头到下标 2 前)
print(arr[(2...)]) // 同 [2...]这是 Swift 写循环比其他语言简洁的核心原因。for i in 0..<arr.count 几乎每个 iOS 工程师每天都会写。
6. 三元与空合并运算符
// 三元运算符:条件 ? 真值 : 假值
let score = 75
let result = score >= 60 ? "及格" : "不及格"
print(result) // 及格
// 空合并运算符 ?? :只对 Optional 有效,空时给默认
let nickname: String? = nil
let displayName = nickname ?? "匿名用户"
print(displayName) // 匿名用户
// 链式使用
let input: String? = nil
let value = input ?? "" // 永远得到 String空合并运算符 ?? 是 Swift 处理可选类型的核心工具之一:a ?? b 表示"a 不为 nil 就用 a 解包后的值,否则用 b"。它让代码极其简洁——对比其他语言的 a != null ? a : b,Swift 用两个字符搞定。
7. 溢出运算符与位运算
普通算术在溢出时会运行时崩溃(这是 Swift 的安全设计)。如果你确定要"环绕"语义,可以用溢出运算符:
// 溢出运算符:在数值溢出时不报错,而是"环绕"
let maxInt = Int.max
print(maxInt) // 9223372036854775807
// 普通运算溢出会报错(运行时崩溃)
// let boom = maxInt + 1 // 运行时错误!
// 溢出运算符: &(加) - 减 乘
let wrapped = maxInt &+ 1
print(wrapped) // -9223372036854775808(变成最小负数)
// 位运算:左移 << 右移 >> 与 & 或 | 异或 ^ 取反 ~
let bits: UInt8 = 0b0000_1111
print(bits << 4) // 240(11110000)
print(bits & 0b0000_0001) // 1位运算在系统编程、加密、图形学里常用,日常 App 开发用得少。知道有这些运算符即可。
8. 运算符优先级(简表)
从高到低,常见运算符的优先级:
- 位_shift:
<<>> - 乘除取余:
*/% - 加减:
+- - 范围:
.....< - 比较:
<>==等 - 逻辑与:
&& - 逻辑或:
|| - 三元 / 空合并:
??? - 赋值:
=+=等(最低)
建议:不要依赖优先级记忆,多用括号 () 让意图清晰。代码是写给人看的,优先级表只用于消除歧义。
9. 自定义运算符(进阶)
Swift 支持自定义运算符,但需要声明和实现。标准库里就有 ++=(数组追加)、??(空合并)等"内置自定义"运算符。日常开发用现有运算符即可,自定义运算符多用于数学库(如向量加减)。
小结
Swift 运算符和 C/Java 大体一致,但有几个独有亮点:范围运算符让循环简洁;空合并 ??让可选处理优雅;无 ++ --强制清晰。下一篇我们把这些运算符用起来——讲控制流。
← 上一篇 Swift 数据类型
下一篇 Swift 控制流 →