Welcome to Swift (苹果官方Swift文档初译与注解十五)---94~100页(第二章)
Assignment Operator (赋值操作符)
赋值操作符可以使用一个值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和OC中不同的是,在Swift中赋值操作符没有返回值,例如下面的代码样例是错误的:
if x = y {
// this is not valid, because x = y does not return a value
}
赋值操作符本身没有返回值可以有效的防止赋值操作(=)偶尔被用成相等操作(==).
Arithmetic Operators (数学操作符)
针对所有的数字类型,Swift提供了四种基本的数学操作符:
-
- Addition (+) 加
- Subtraction (-) 减
- Multiplication (*) 乘
- Division (/) 除
1 + 2 // equals 3
5 - 3 // equals 2
2 * 3 // equals 6
10.0 / 2.5 // equals 4.0
不同于C和OC的数学操作符,在Swift中,数学操作符默认是不允许数值溢出(超出数值储存范围).如果需要进行数值溢出,可以使用溢出操作符(例如:a &+ b)
加法操作符支持字符串(String)的连接:
“hello, " + "world" // equals "hello, world”
两个字符,或者一个字符与一个字符串,都可以相加后得到一个新的字符串(String):
let dog: Character = "🐶"
let cow: Character = "🐮"
let dogCow = dog + cow
// dogCow is equal to "🐶🐮”
Remainder Operator (取余操作符)
取余操作 (a % b)计算出a整除b之后,余数的值.
注意点:
取余操作在其他语言中,也被称为取模操作.负数也可以进行取余操作.
下面介绍取余操作是怎样工作的,为了计算 9%4 ,第一步是算出在9里面包含多少个4:
可以看出,9里面包含了两个4,并且剩余的数值是1 (上图橙色里的部分).
在Swift中,这样的操作写为:
9 % 4 // equals 1
为了计算 a%b的结果,取模操作符%进行下面的方程式运算,并返回余数(remainder):
a = (b × some multiplier) + remainder
some multiplier是b能够使用的最大乘数.
把9和4放到这个方程式中:
9 = (4 × 2) + 1
对负数进行取余操作也是同样的方法:
-9 % 4 // equals -1
把-9和4代入到方程式中:
-9 = (4 × -2) + -1
得到余数值是-1.
取余操作符后面的数值符号会被忽略的.这就是说a%b与a%-b是相同的.
Floating-Point Remainder Calculations (浮点类型取余运算)
与C和OC不同,Swift的取余操作也可以处理浮点类型的值:
8 % 2.5 // equals 0.5
这个例子里,8除以2.5等于3,余0.5,因此取余操作返回一个Double类型的值0.5.
Increment and Decrement Operators (自增和自减操作符)
与C语言一样,当给一个数字变量增1或者减1的时候,Swift也提供这种操作的缩写方式:自增操作符(++)和自减操作符(--),它们对任意整数类型变量和浮点类型变量都有效.
var i = 0
++i // i now equals 1
每次调用++i,i的值都增加1.++i是i = i + 1的缩写.同样,--i是i = i -1的缩写.
操作符++和--可以用成前缀或者后缀.++i 和i++都是给i值增1的合法方式.同样的,--i和i--也是给i值减1的合法方式.
注意++和--操作符修改i值后,也会返回一个值.如果你只关注自增或自减后的i值,那么可以忽略操作符的返回值.但是如果你需要使用这个返回值,那么前缀操作和后缀操作结果是不同 的.参考如下规则:
-
- 如果自增或自减操作符是在变量之前,那么先对变量进行自增或自减运算,然后返回变量的值;
- 如果自增或自减操作符在变量之后,那么先返回变量的值,然后再进行变量的自增或自减操作.
代码样例:
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
在上面的例子中, let b = ++a 会先使a增加1,然后返回a增值后的结果.这就是为什么a和b的值都等于一个新值1.
然而, let c = a++ 会先返回a的值,然后a进行增1操作.这就意味着,c得到的是a的旧值1,而a已经自增后等于2了.
除非你明确需要使用i++,否则我们建议无论什么情况,推荐使用++i和--i.因为它们都有明显的符合预期的意图:修改i,然后返回修改后的结果.