Swift數值運算
數值運算
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
雖然一元+
做無用功,但當你在使用一元負號來表達負數時,你可以使用一元正號來表達正數,如此你的代碼會具有對稱美。