Swift Basic Operators

操作符就是一些专用的符号或短语,用于值的检查、更改、合并等。例如加号操作符+ 将两个数加起来(as in let i = 1 + 2)。更复杂的例子如逻辑与AND操作符&& (as in if enteredDoorCode && passedRetinaScan)和增值操作符++i,方便的给指定变量i 的值加1

Swift支持大多数标准 C 操作符,并改进了几个功能用以消除常见的编码错误。赋值操作符 = 不返回值,可防止在使用等于操作符 == 时错误地使用了赋值操作符。数学操作符(+, -, *, / % 等)会检测并阻止溢出,以避免出现超出类型允许存储范围的意外结果。使用Swift的溢出操作符,可以选择值溢出的行为,进一步的信息请看溢出操作符

与 C 不同的是,Swift允许浮点数进行取余(%)运算。还提供了两个 C 没有的范围操作符(a..a...b),用于简便地表示范围内的值

这章主要讲述Swift的常用操作符。其他高级操作符请看高级操作符,在那章里主要讲怎样自定义操作符和为自定义类实现标准操作符

术语 Terminology


操作符分为一元(unary)、二元(binary)、三元(ternary)操作符:

  • 一元操作符只作用于一个目标/操作数(如 -a)。一元前缀操作符紧挨在操作数前(例如 !b),一元后缀操作符紧挨在操作数的后面(例如 i++
  • 二元操作符有两个操作数(如 2 + 3),并在两个操作数中间,是中缀操作符
  • 三元操作符有三个操作数。和 C 一样,Swift只有一个三元操作符:条件操作符(a ? b : c

操作符使用的值就叫操作数。在表达式 1 + 2中,+ 加号是二元操作符,而他的两个操作数是 12

赋值操作符 Assignment Operator


赋值操作符(a = b)使用 b 的值初始化或更新 a 的值


let b = 10
var a = 5
a = b
// a is now equal to 10

如果赋值操作符右侧是一个有多个值的元组,其元素的值可以分解到多个常量或变量中:


let (x, y) = (1, 2)
// x is equal to 1, and y is equal to 2

与 C 和 Objective-C 不同,赋值操作符本身不返回值,所以下面对语句是无效的:


if x = y {
// this is not valid, because x = y does not return a value
}

这个特性会防止将相等操作符(==),意外写成赋值操作符(=)。因为 if x = y 无效,所以Swift将帮助你避免代码中的此类问题。

算数操作符 Arithmetic Operators


Swift的所有数字类型都支持4种标准的算数操作符:

  • 加(+
  • 减(-
  • 乘(*
  • 除(/


1 + 2 // equals 3
5 - 3 // equals 2
2 * 3 // equals 6
10.0 / 2.5 // equals 4.0

不同于 C 和 Objective-C 的算数操作符,Swift算数操作符默认不允许值溢出。可以使用Swift的溢出操作符选择溢出行为(如 a &+ b)。详情请看溢出操作符

加号操作符同时也支持 String 连结:


"hello, " + "world" // equals "hello, world"

取余操作符 Remainder Operator

取余操作符(a % b)算出 a 能容纳多少个 b,并返回剩下的值(即:余数)

注:取余操作符在其他语言中也有的叫取模操作符。不过严格来说,在Swift中对于负数而言是余数而不是模操作

下图演示取余操作符如何计算的。 计算 9 % 4,首先要算出 9 里面有多少个 4

整数计算余数

可以看出,这里有两个 4,最后剩余 1(图中黄色的部分)

中Swift中,取余操作符使用方法如下:


9 % 4 // equals 1

要确定 a % b 的答案,% 操作符计算如下等式并返回 remainder
a = (b x some multiplier) + remainder
some multiplier是最大的乘以 b 仍能容纳于 a 的数

94 代入等式,产出:
9 = (4 x 2) + 1

同样,负数也使用此方法计算余数


-9 % 4 // equals -1

-94 代入等式,产出:
-9 = (4 x -2) + -1
余数是 -1

some multiplier如果是负数,将会忽视其符号。意思是 a % ba % -b 将返回相同的结果

浮点数余数计算 Floating-Point Remainder Calculations

不同于 C 和 Objective-C 的取余操作符,Swift的取余操作符可以计算浮点数的余数:


8 % 2.5 // equals 0.5

浮点数计算余数

增量和减量操作符 Increment and Decrement Operators

与 C 类似,Swift也提供了增量操作符(++)和减量操作符(--),方便的对数值进行加/减 1 操作,可以用于整数和浮点数变量


var i = 0
++i // i now equals 1

每调用 ++i 一次,i 的值增加 1,本质上说,++ii = i + 1 的简写。类似地,--i 可以是 i = i - 1 的简写

++-- 即可以用作前缀操作符,也可以用作后缀操作符。++ii++ 都可以使 i 的值加 1。类似地,--ii-- 都可以使 i 值减 1

注意,这两个操作符即修改 i 的值,也返回值。如果只是想 i 加/减 1,可以忽略返回值。然而,如果想使用返回值,那么前缀和后缀操作符会返回不同的值,规则如下:

  • 如果操作符在变量前,则先改变变量值,并返回改变后的值
  • 如果操作符中变量后,则先返回变量原值,后改变变量的值


var a = 0
let b = ++a
// a and b are now both equal to 1
let c = a++
// a is now equal to 2, but c has been set to the pre-increment value of 1

除非你需要以 i++ 的方式使用操作符,否则推荐在所有的情况下使用 ++i--i 的形式,因为返回值与实际值是相同的。

一元负号操作符 Unary Minus Operator

使用 - 操作符(前缀操作符)可以每次切换数值的符号,这就是负号操作符


let three = 3
let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus three"

负号操作符需要紧挨在操作数前面,之间不能有任何空白字符

一元正号操作符 Unary Plus Operator

使用 + 操作符,将会返回原值,而且对原值不会产生任何影响


let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix equals -6

虽然 + 操作符没有做任何事情,不过在代码中,对正数使用 + 操作符和对负数使用 - 操作符能使代码看起来比较整齐

组合赋值操作符 Compound Assignment Operators


像 C 一样,Swift提供了组合赋值操作符,将 = 与其他操作符组合在一起使用:


var a = 1
a += 2
// a is now equal to 3

表达式 a += 2 使 a = a + 2 的简写。将加法与赋值组合进一个操作符,这两个操作将同时执行。

注:组合赋值操作符不返回值。这点与上面提及的 ++--不同

要查看所有的组合赋值操作符,请看Swift Language Reference 之 表达式

比较操作符 Comparison Operators


Swift 支持所有标准 C 比较操作符:

  • 等于 (a == b)
  • 不等于 (a != b)
  • 大于 (a > b)
  • 小于 (a < b)
  • 大于等于 (a >= b)
  • 小于等于 (a <= b)

注:Swift还提供了两个辨识操作符(===!==),用来比较两个对象引用是否是指向同一个对象实例,更多信息请参考类与结构

每个比较操作符都返回 Bool 值,指示语句是否为 true:


1 == 1 // true, because 1 is equal to 1
2 != 1 // true, because 2 is not equal to 1
2 > 1 // true, because 2 is greater than 1
1 < 2 // true, because 1 is less than 2
1 >= 1 // true, because 1 is greater than or equal to 1
2 <= 1 // false, because 2 is not less than or equal to 1

比较操作符通常用在条件语句中,比如 if 语句:


let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry (name), but I don't recognize you")
}
// prints "hello, world", because name is indeed equal to "world"

想了解更多关于 if 的信息,请参考控制流

三元条件操作符 Ternary Conditional Operator


三元条件操作符有三个操作数,是比较特殊的一个操作符,它是这样的形式:question ? answer1 : answer2。它根据 question 是 true 还是 false,能快捷的计算两个表达式之一的值。如果为 true,计算并返回 answer1 的值;false 计算并返回 answer2 的值

三元条件操作符是如下代码的简写:


if question {
answer1
} else {
answer2
}

实际使用时,参考下例:


let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90

前例展开后,是如下代码


let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
rowHeight = rowHeight + 50
} else {
rowHeight = rowHeight + 20
}
// rowHeight is equal to 90

如果过多使用三元条件操作符,会导致代码可读性变坏。
避免嵌套使用三元条件操作符。

Nil合并操作符 Nil Coalescing Operator


nil coalescing operator (a ?? b),如果 Optional a 有值,就解包 a,否则如果 anil 返回 ba 必须是 Optional 类型,ba 存储的类型必须一致。

nil coalescing operator 是如下使用三元条件操作符的代码的简写:


a != nil ? a! : b

注:如果 a 不为 nil ,b 的值不会计算,即:短路计算(short-circuit)

举例如下:


let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"

如果给 userDefinedColorName 赋值,则如下:


userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is not nil, so colorNameToUse is set to "green"

范围操作符 Range Operators


Swift 有两种范围操作符,用来简化一个范围内值的表示方式

封闭范围操作符 Closed Range Operator

(a...b) 定义一个从 ab 的范围内的值,包括 aba 的值一定不可以大于 b

一般在遍历范围内所有值的时候使用,例如for-in 循环:


for index in 1...5 {
print("(index) times 5 is (index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

半开范围操作符 Half-Open Range Operator

(a..) 定义一个从 ab 的范围内的值,包括 a 但不包括 ba 的值一定不可以大于 b。如果 a 等于 b,则范围为空

对于遍历从 0 开始的列表有其实用:


let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..< count { //这里小于号与count要链接在一起,但因为与html冲突问题未解决,所以加了空格
print("Person (i + 1) is called (names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

逻辑操作符 Logical Operators


逻辑操作符修改或组合 Boolean 逻辑值 true 和 false。Swift有三个逻辑操作符,都可以在基于C的编程语言中找到:

  • 逻辑非 NOT (!a)
  • 逻辑与 AND (a && b)
  • 逻辑或 OR (a || b)

Logical NOT Operator

逻辑非(!a)操作符将 Boolean 值取反,即 true 变为 false,false 变为 true

逻辑非是前缀操作符,并且要紧挨在操作数之前,之间不能有空白:


let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// prints "ACCESS DENIED"

注意在给常量或变量起名时,保持代码的可读性。避免双重否定或混乱的逻辑语句

Logical AND Operator

逻辑与操作符 (a && b),需要两个操作数都为 true 时,才返回 true,其他情况都返回 false

如果第一个操作数为 false, 第二个操作数就不会再计算了,即:短路计算


let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "ACCESS DENIED"

Logical OR Operator

逻辑或操作符 (a || b),需要两个操作数都为 false 时,才返回 false,其他情况都返回 true

如果第一个操作数为 true, 第二个操作数就不会再计算了,即:短路计算


let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"

组合使用逻辑操作符 Combining Logical Operators

可以使用多个逻辑操作符构成一个复合表达式:


if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"

该例将多个逻辑操作符(&&||)组合使用。然而,因为(&&||)都是二元操作符,所以这里实际是三个小的表达式链在一起,解读:

如果输入了正确的进门编码并且通过了视网膜扫描,或者有门钥匙,或者知道紧急超级密码,都可以访问。

注:Swift 的逻辑操作符 &&|| 都是左关联,即多个逻辑操作符组成复合表达式时,最先从左边开始计算子表达式的值

显示使用括号 Explicit Parentheses

在逻辑表达式中增加括号,即使不是严格需要时,也会有助于增加代码到可读性。在上例中使用括号,如下:


if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"

就会使逻辑语句变得关系清晰,易于阅读,并且不改变表达式的结果

参考:The Swift Programming Language

你可能感兴趣的:(Swift Basic Operators)