与C相比的特点:
- 在Swift中
=是不会返回值的。 - 算术运算符会检测溢出,不允许这样做。但是你也可以设置允许溢出。
- 范围运算符
a..<b和a...b
Terminology
- unary(一元的),比如
-a和!a - binary,比如
a + b - ternary(三元的),唯一的三元运算符
a ? b : c
Assignment Operator
- 一次性赋值
let (x, y) = (1, 2)
=不返回值,这样做是为了避免混淆==的使用。
if x = y {
// 无效的
}
算术运算符
+ - * /不允许溢出。但也可以设置溢出,相关知识在Overflow Operators,比如a &+ b是表示可以溢出。- 与C不一样的是,
+可以应用在字符串上。
取余运算符
注意它是真的取余,而不是模运算。与C语言是不一样的。
它遵循a = (b x some multiplier) + remainder的运算。例子如下
9 % 4 = 1
-9 % 4 = -1 // 在C和Python中 -9 % 4 = 3
也就是说a % b and a % -b会得出相同的答案。
一元加减运算符
-就是取反
let three = 3
let minusThree = -three // 等于-3
+不做任何事,就是让强迫症的你用来对称-的出现。
组合运算符
var a = 1
a += 2
// a is now equal to 3
同样的,+=也是不返回任何值的。
比较运算符
a == b
a != b
a > b
a < b
a >= b
a <= b
还有判断两个对象是否出自同一个类的运算法===和!==
对于tuples的比较
(1, "zebra") < (2, "apple") // true
(3, "apple") < (3, "bird") // true
(4, "dog") == (4, "dog") // true
所以它是从左到右对相同位置的元素逐个比较的。
另外,Bool值是不可以比较的,否则会产生错误。
三元运算符
question ? answer1 : answer2与C语言一样。
Nil-Coalescing Operator
a ?? b
// 它是下面的简写
a != nil ? a! : b
也就是当a不是nil时就解包a然后返回它,否则就返回b。而b的类型必须与a匹配。
范围运算符
a...b // [a, b]
a..<b // [a, b)
array[2...] // [2, array.end]
array[...2] // [array.start, 2]
array[..<2] // [array.start, 2)
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
逻辑运算符
- Logical NOT (
!a) - Logical AND (
a && b) - Logical OR (
a || b) &&and||的优先级是从左到右的(left-associative)。- 如果是在搞不清楚就加括号吧,也推荐这样做,可以提高易读性。