运算符(Operator)到底是什么?
- 运算符 = 用来「检查、改变、合并」值的特殊符号或短语。
- 操作数(Operand) = 被运算符影响的值。
- 按操作数个数分类:
- 一元(Unary):
-a
、!b
、c!
- 二元(Binary):
a + b
- 三元(Ternary):Swift 只有
a ? b : c
- 一元(Unary):
赋值运算符(Assignment Operator)
- 不会返回值,杜绝了 C/Obj-C 中容易写错的
if (x = y)
问题。 - 支持「元组解构」一次性赋多个值。
swift
let (x, y) = (1, 2) // x = 1, y = 2
// if x = y { ... } // ❌ 编译错误,赋值不返回 Void 以外的东西
算术运算符(Arithmetic Operators)
运算符 | 含义 |
---|---|
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
% |
取余 |
- 默认「溢出检查」
Swift 会主动阻止值溢出;若需要溢出行为,用「溢出运算符」&+
&-
&*
。
swift
let a = Int.max
let b = a &+ 1 // 显式允许溢出,得到 Int.min
+
也能拼接字符串
swift
let hello = "Hello, "
let world = "World!"
let greeting = hello + world // "Hello, World!"
- 取余运算符
%
的特点
- 对负数照样适用,符号跟随第一个操作数。
b
为负时会被忽略,即a % b == a % -b
。
swift
9 % 4 // 1
-9 % 4 // -1
9 % -4 // 1(与 9 % 4 相同)
一元运算符(Unary Operators)
运算符 | 作用 | 示例 |
---|---|---|
- |
取相反数 | -num |
+ |
返回自身(无计算),可与 - 形成对称 |
+num |
复合赋值运算符(Compound Assignment Operators)
把「计算 + 赋值」合二为一,写法与 C 一致:
swift
var a = 5
a += 3 // 等价于 a = a + 3
a *= 2 // a = 10
注意:复合赋值没有返回值,所以 let b = a += 2
是非法的。
比较运算符(Comparison Operators)
全返回 Bool
:
运算符 | 含义 |
---|---|
== |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
- 元组比较(从左到右「字典序」)
要求:同类型、同数量,且对应元素都能比较。
swift
(1, "zebra") < (2, "apple") // true,先比 1<2,后面不再看
(3, "apple") < (3, "bird") // true,首元素同,继续比 "apple"<"bird"
(4, "dog") == (4, "dog") // true
如果元素含不可比较类型(如 Bool
不支持 <
),则编译器直接报错。
三元条件运算符(Ternary Conditional)
Swift 唯一的三元运算符:question ? answer1 : answer2
swift
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
优点:简洁;缺点:嵌套过多可读性差。官方建议不要连续多个三元嵌套。
空合运算符(Nil-Coalescing Operator)
语法:a ?? b
a
必须是 Optional 类型- 若
a
有值则解包返回,否则返回b
b
的类型必须与a
内部存储类型一致
swift
var userPick: String? = nil
let defaultColor = "red"
let color = userPick ?? defaultColor // "red"
userPick = "green"
let newColor = userPick ?? defaultColor // "green"
区间运算符(Range Operators)
Swift 提供三种常用区间,写法比 C 更直观:
- 闭区间
a...b
(含 b)
swift
for index in 1...5 { // 1,2,3,4,5
print(index)
}
- 半开区间
a..<b
(不含 b)
swift
let names = ["A", "B", "C", "D"]
for i in 0..<names.count { // 0,1,2,3
print(names[i])
}
- 单侧区间(One-Sided Range)
省略一侧即可,常用于「从某索引到末尾」或「从头开始到某索引」:
swift
let nums = [10, 20, 30, 40, 50]
let suffix = nums[2...] // [30, 40, 50]
let prefix = nums[..<2] // [10, 20]
let slice = nums[1...3] // [20, 30, 40]
注意:省略起始值的单侧区间不能用于 for-in
,因为编译器不知道从哪里开始。
逻辑运算符(Logical Operators)
运算符 | 读法 | 特点 |
---|---|---|
!(a) |
not a | 一元,前置 |
a && b |
a and b | 两真才真,短路 |
`a | b` |
- 短路示例
swift
if (false && someFunc()) {
// someFunc() 根本不会被执行
}
- 多条件组合 + 括号提升可读性
swift
let enteredDoorCode = true
let passedRetinaScan = false
let hasDoorKey = false
let knowsOverride = true
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverride {
print("开门放行")
}
经验:复杂逻辑务必用括号分组,哪怕优先级本就对------可读性第一。