Swift 让所有数值类型都支持了基本的四则运算:
- 加法(
+
) - 减法(
-
) - 乘法(
*
) - 除法(
/
)
1 + 2 // 等于 3 5 - 3 // 等于 2 2 * 3 // 等于 6 10.0 / 2.5 // 等于 4.0
与 C 语言和 Objective-C 不同的是,Swift 默认不允许在数值运算中出现溢出情况。但你可以使用 Swift 的溢出运算符来达到你有目的的溢出(如a &+ b
)。详情参见溢出运算符。
加法运算符也用于String
的拼接:
"hello," + "world" // 等于 "hello,world"
两个Character
值或一个String
和一个Character
值,相加会生成一个新的String
值:
let dog: Character = "d" let cow: Character = "c" let dogCow = dog + cow // 译者注: 原来的引号内是很可爱的小狗和小牛,但win os下不支持表情字符,所以改成了普通字符 // dogCow 现在是 "dc"
详情参见字符,字符串的拼接。
求余运算
求余运算(a % b
)是计算b
的多少倍刚刚好可以容入a
,返回多出来的那部分(余数)。
注意:
求余运算(%
)在其他语言也叫取模运算。然而严格说来,我们看该运算符对负数的操作结果,"求余"比"取模"更合适些。
我们来谈谈取余是怎么回事,计算9 % 4
,你先计算出4
的多少倍会刚好可以容入9
中:
2倍,非常好,那余数是1(用橙色标出)
在 Swift 中这么来表达:
9 % 4 // 等于 1
为了得到a % b
的结果,%
计算了以下等式,并输出余数
作为结果:
a = (b × 倍数) + 余数
当倍数
取最大值的时候,就会刚好可以容入a
中。
把9
和4
代入等式中,我们得1
:
9 = (4 × 2) + 1
同样的方法,我来们计算-9 % 4
:
-9 % 4 // 等于 -1
把-9
和4
代入等式,-2
是取到的最大整数:
-9 = (4 × -2) + -1
余数是-1
。
在对负数b
求余时,b
的符号会被忽略。这意味着a % b
和a % -b
的结果是相同的。
浮点数求余计算
不同于 C 语言和 Objective-C,Swift 中是可以对浮点数进行求余的。
8 % 2.5 // 等于 0.5
这个例子中,8
除于2.5
等于3
余0.5
,所以结果是一个Double
值0.5
。
自增和自增运算
和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++
)和自减(--
)的运算符。其操作对象可以是整形和浮点型。
var i = 0 ++i // 现在 i = 1
每调用一次++i
,i
的值就会加1。实际上,++i
是i = i + 1
的简写,而--i
是i = i - 1
的简写。
++
和--
既是前置又是后置运算。++i
,i++
,--i
和i--
都是有效的写法。
我们需要注意的是这些运算符修改了i
后有一个返回值。如果你只想修改i
的值,那你就可以忽略这个返回值。但如果你想使用返回值,你就需要留意前置和后置操作的返回值是不同的。
-
当
++
前置的时候,先自増再返回。 -
当
++
后置的时候,先返回再自增。
例如:
var a = 0 let b = ++a // a 和 b 现在都是 1 let c = a++ // a 现在 2,但 c 是 a 自增前的值 1
上述例子,let b = ++a
先把a
加1了再返回a
的值。所以a
和b
都是新值1
。
而let c = a++
,是先返回了a
的值,然后a
才加1。所以c
得到了a
的旧值1,而a
加1后变成2。
除非你需要使用i++
的特性,不然推荐你使用++i
和--i
,因为先修改后返回这样的行为更符合我们的逻辑。
一元负号
数值的正负号可以使用前缀-
(即一元负号)来切换:
let three = 3 let minusThree = -three // minusThree 等于 -3 let plusThree = -minusThree // plusThree 等于 3,或 "负负3"
一元负号(-
)写在操作数之前,中间没有空格。
一元正号
一元正号(+
)不做任何改变地返回操作数的值。
let minusSix = -6 let alsoMinusSix = +minusSix // alsoMinusSix 等于 -6
虽然一元+
做无用功,但当你在使用一元负号来表达负数时,你可以使用一元正号来表达正数,如此你的代码会具有对称美。