The Swift Programming Language 5.2-2 for Basic Operators

166 阅读2分钟

与C相比的特点:

  • 在Swift中=是不会返回值的。
  • 算术运算符会检测溢出,不允许这样做。但是你也可以设置允许溢出。
  • 范围运算符a..<ba...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)。
  • 如果是在搞不清楚就加括号吧,也推荐这样做,可以提高易读性。