简介
- Swift 支持大部分标准 C 语言的运算符,且为了减少常见编码错误做了部分改进。
- 如:赋值符(=)不再有返回值,这样就消除了手误将判等运算符(==)写成赋值符导致代码错误的缺陷。
- 算术运算符(+,-,*,/,% 等)的结果会被检测并禁止值溢出,以此来避免保存变量时由于变量大于或小于其类型所能承载的范围时导致的异常结果。
1. 元组比较
- 两个元组的元素相同,且长度相同的话,元组就可以被比较。
- 比较元组大小会按照从左到右、逐值比较的方式,直到发现有两个值不等时停止。如果所有的值都相等,那么这一对元组我们就称它们是相等的。
(1, "zebra") < (2, "apple") // true,因为 1 小于 2
(3, "apple") < (3, "bird") // true,因为 3 等于 3,但是 apple 小于 bird
(4, "dog") == (4, "dog") // true,因为 4 等于 4,dog 等于 dog
("blue", -1) < ("purple", 1) // true
("blue", false) < ("purple", true) // 错误,因为 < 不能比较布尔类型
在上面的例子中,你可以看到,在第一行中从左到右的比较行为。因为 1 小于 2,所以 (1, "zebra") 小于 (2, "apple"),不管元组剩下的值如何。所以 "zebra" 大于 "apple" 对结果没有任何影响,因为元组的比较结果已经被第一个元素决定了。不过,当元组的第一个元素相同时候,第二个元素将会用作比较-第二行和第三行代码就发生了这样的比较。
注意:
1. Bool 不能被比较,也意味着存有布尔类型的元组不能被比较。
2. Swift 标准库只能比较七个以内元素的元组比较函数。如果你的元组元素超过七个时,你需要自己实现比较运算符。
2. 空合运算符(Nil Coalescing Operator)
- 空合运算符(a ?? b)将对可选类型 a 进行空判断。
- 如果 a 包含一个值就进行解包,否则就返回一个默认值 b。
- 表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。
空合运算符是对以下代码的简短表达方法:
a != nil ? a! : b
上述代码使用了三元运算符,当可选类型 a 的值不为空时,进行强制解封(a!),访问 a 中的值;反之返回默认值 b。无疑空合运算符(??)提供了一种更为优雅的方式去封装条件判断和解封两种行为,显得简洁以及更具可读性。
注意:如果 a 为非空值(non-nil),那么值 b 将不会被计算。这也就是所谓的短路求值。
let a= "red"
var b: String? // 默认值为 nil
var c = b ?? a // userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
2. 区间运算符(Range Operators)
2.1 闭区间运算符
- 闭区间运算符:(a...b)
- 定义一个包含从 a 到 b(包括 a 和 b)的所有值的区间。
- a 的值不能超过 b。
for index in 1...5 {
print("\(index) * 5 = \(index * 5)")
}
// 1 * 5 = 5
// 2 * 5 = 10
// 3 * 5 = 15
// 4 * 5 = 20
// 5 * 5 = 25
2.2 半开区间运算符
- 半开区间运算符:(a..<b)
- 定义一个从 a 到 b 但不包括 b 的区间。
- 该区间包含第一个值而不包括最后的值。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("第 \(i + 1) 个人叫 \(names[i])")
}
// 第 1 个人叫 Anna
// 第 2 个人叫 Alex
// 第 3 个人叫 Brian
// 第 4 个人叫 Jack
2.3 单侧区间
- 表达往一侧无限延伸的区间。
一个包含了数组从索引 2 到结尾的所有值的区间。在这些情况下,你可以省略掉区间操作符一侧的值。这种区间叫做单侧区间,因为操作符只有一侧有值。
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
print(name)
}
// Anna
// Alex
你可以查看一个单侧区间是否包含某个特定的值。
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
注意:
1. 你不能遍历省略了初始值的单侧区间,因为遍历的开端并不明显。
2. 你可以遍历一个省略最终值的单侧区间;然而,由于这种区间无限延伸的特性,请保证你在循环里有一个结束循环的分支。
3. 逻辑运算符组合计算
Swift 逻辑操作符 && 和 || 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
let a = true, b = false, c = true, d = false
if a && b || c || d {
print("Welcome!")
} else {
print("close")
}
// 输出“Welcome!”