英文版PDFhttp://download.csdn.net/detail/tsingheng/7480427
運算子是指一個特殊的符號,可以用來查看,更改值或者相加。比如說加法運算子+可以講兩個數字加起來。還有一些複雜的例子比如邏輯與&&或者自增++。Swift支援C中得大部分運算子,並且加入了一些增強特性來減少代碼中的錯誤。賦值預算符=不會返回值,這樣就避免了在應該使用比較子==的地方誤用=。數學運算子(加減乘除模)會做溢出判斷,這樣避免了值溢出的時候出現的奇怪現象。你可以選擇使用Swift提供的溢出運算來允許溢出,很後面的時候會有介紹。
Swift浮點數是可以進行求模運算的,C是不可以的。Swift還提供了範圍符號(1..4和4...6)。
這張還是介紹一些通用的操作符,特殊操作符在後面Swift特殊操作符裡面介紹,還會介紹怎麼自訂動作符或者為自訂類實現操作符運算。
1.術語
運算子可以是一元、二元或者三元的。
- 一元運算子只對單個值進行操作。一元運算子通常都緊貼這操作對象,前後都有。
- 二元運算子對像個值進行操作。一般出現在兩個操作對象中間。
- 三元運算子涉及三個對象,而且Swift語言裡面只有一個三元操作符。(a ? b: c)毫無疑問。
運算子影響的值叫運算元。對於運算式1+2來說,加號(+)是個二元運算子,他的兩個運算元分別是1跟2。
賦值運算子
賦值運算子(a = b)使用b的值來初始化或者更新a的值。
let b = 10var a = 5a = 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}
這個特性防止了該用==的地方使用=。編譯器對if x= y報錯,你就能避免這類錯誤了。
2.數學運算子
Swift提供四個標準數學運算子支援多有的數字類型。加減乘除
1 + 2 // equals 35 - 3 // equals 22 * 3 // equals 610.0 / 2.5 // equals 4.0
但是預設情況下Swift數學運算子是不允許溢出的。你可以通過溢出運算子來允許溢出比如說 a &+ b;
加號運算子還能用來連接字串 比如"hello," + "china"結果是“hello,china”。兩個字元,或者一個字元跟一個字串,都能相加得到字串。(下面例子裡面字元用的是Emoji,不windows應該是不支援吧,我猜的。)
let dog: Character = "d"let cow: Character = "c"let dogCow = dog + cow// dogCow is equal to "dc”
求餘運算子
求餘運算(a % b)是指a = n*b+c,n是整數,c要比b小,c就是結果。
NOTE 求餘運算與其他語言裡面的求模運算很想。但是Swift裡面求餘還可以是負數,所以還是叫求餘運算。
這裡有個圖示說明求餘怎麼回事。加入要計算9%4,首先要計算9裡面可以放幾個4:
9裡面可以放得下2個4,剩下的就是1了。
要計算a%b的結果,%運算使用公式a = (b*someMultiplier) + remainder,並且用remainder作為返回值。someMultiplier是a中能容得下b的最大數量,帶入上面的例子就是9 = (4*2) + 1
當a是負數的時候也是一樣的方法。 -9%4 等於-1,代入公式就是 -9 = (4*-2)+(-1),結果是就是-1,如果b是負數的話,b的負號都會唄忽略,所以a%b和a%-b的結果總是一樣的。
浮點數求餘運算
Swift求餘運算還能用於浮點數比如8%2.5結果是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的值,可以忽略最後的返回值,但是當你要使用返回值的時候要注意首碼跟尾碼的區別。如果使用首碼,返回的是加1前的值,使用尾碼返回的是加1後的值。例如
var a = 0let b = ++a// a and b are now both equal to 1let 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的。所以說這個完了以後a是2,而c等於1。
這裡說建議盡量都是++i和--i的形式,我在JAVA裡面都是寫i++啊。
一元負運算子
數位符號可以用-來改變,-就是個一元運算子
let three = 3let minusThree = -three // minusThree equals -3let plusThree = -minusThree // plusThree equals 3, or "minus minus three”
-直接放在操作對象的前面,中間不要有任何空格。
一元正運算子
+號運算子只是返回操作對象的值,不會有任何改變。
let minusSix = -6let alsoMinusSix = +minusSix // alsoMinusSix equals -6
雖然說加號不錯任何改變,但是如果你代碼裡給負數加負號,給正數加正號就顯得對稱多了。
複合賦值運算
Swift也提供了複合賦值運算,用來結合賦值運算子和其他的運算子。典型的例子就是+=了
var a = 1a += 2// a is now equal to 3
a += 2就是a = a+2的縮寫。兩種方式只是第一種將兩個運算子結合到一起了,兩種方式執行時間是一樣的。
NOTE 複合運算子沒有返回值,比如說不能使用let b = a+=2。這個是跟自增自減運算不一樣的地方。
3.比較子
Swift支援C所有的比較子,比較相等,比較不相等,大於,小於,大於等於,小於等於
NOTE Swift還提供了兩個身份比較子===和!==,用來比較是兩個對象的引用還是同一個對象的引用。
每個比較子返回值都是Bool,表示這個運算式是不是正確的。
1 == 1 // true, because 1 is equal to 12 != 1 // true, because 2 is not equal to 12 > 1 // true, because 2 is greater than 11 < 2 // true, because 1 is less than 21 >= 1 // true, because 1 is greater than or equal to 12 <= 1 // false, because 2 is not less than or equal to 1
比較子通常用在條件陳述式中,比如if語句
let name = "world"if name == "world" { println("hello, world")} else { println("I'm sorry \(name), but I don't recognize you")}// prints "hello, world", because name is indeed equal to "world”
4.三元條件運算子
三元條件運算子是一種特殊的運算,由三個部分組成,形式是 question ? answer1 : answer2。這是根據一個條件question是true還是false決定計算後面那個運算式。如果question是ture就計算answer1並且返回answer1的計算結果,如果是false就是answer2了。用代碼錶示就是這樣:
if question { answer1} else { answer2}
下面有個例子,計算表格行的高度。如果表格有表頭,行高就要比內容高50px,如果沒有表頭,就比內容高20px:
let contentHeight = 40let hasHeader = truelet rowHeight = contentHeight + (hasHeader ? 50 : 20)// rowHeight is equal to 90
用if來寫就是這樣的
let contentHeight = 40let hasHeader = truevar rowHeight = contentHeightif hasHeader { rowHeight = rowHeight + 50} else { rowHeight = rowHeight + 20}// rowHeight is equal to 90
使用三元運算子的話設定行高只要一行代碼就行了。比後面用if的簡介多了,還不用把rowHeight定義成變數,因為在if裡面根本不需要去改變rowHeight的值。
三元運算子提供了一種高效的方式來表達兩選一的情況。但是使用三元運算子的時候也要注意,如果太簡潔了可能會降低代碼的可讀性。避免結合多個三元運算子搞成一條語句。
5.範圍運算子
Swift提供兩種範圍運算子,用來表示數值範圍
閉區間範圍運算子
閉區間範圍運算子(a...b)定義了從a到b得範圍,並且包含a和b。當你要遍曆某個範圍並且需要範圍裡面每個值都要用到的時候就可以用範圍運算子了,比如for-in迴圈
for index in 1...5 { println("\(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
半閉範圍運算子
半閉範圍運算子(a..b)定義了從a到b包含a但不包含b的範圍,之所以叫半閉範圍運算子就是因為只包含左邊屆不包含右邊界。
半閉範圍運算子對於遍曆數組這種下標從0開始但是不包含數組長度的遍曆很有用。
let names = ["Anna", "Alex", "Brian", "Jack"]let count = names.countfor i in 0..count { println("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
注意數組包含四項,但是0..count只包含到3。
6.邏輯運算子
邏輯運算子可以修改或者結合邏輯值true和false。Swift支援三種標準的邏輯操作符 非(!),與(&&),或(||)
邏輯非運算子
邏輯非運算子取相反的結果,所以true變成false,flase變成true。邏輯非運算子是首碼運算子,並且跟操作對象中間不允許有空格。可以被讀作“不是a”
let allowedEntry = falseif !allowedEntry { println("ACCESS DENIED")}// prints "ACCESS DENIED"
運算式if !allowedEntry可以被讀作“如果不是允許進入”,if裡面的代碼只有如果不是允許進入是真的時候才能執行,也就是如果允許進入是false的時候。
就像這個例子一樣,給Boolean型變數或者常量取個好名字能保持代碼整潔易讀,盡量避免使用雙重否定或者一些容易讓人困惑的表達。
邏輯與操作符
對於邏輯與(a && b)操作符來說只有a跟b都是true的時候他才返回true,否則返回false。a跟b任何一個為false,整個運算式都是false,事實上,如果a是false,b就不會再去計算了,因為沒有必要啊。下面例子使用了兩個bool值,並且只有兩個都為true的時候才能輸出welcome
let enteredDoorCode = truelet passedRetinaScan = falseif enteredDoorCode && passedRetinaScan { println("Welcome!")} else { println("ACCESS DENIED")}// prints "ACCESS DENIED”
邏輯或運算子
對於邏輯或(a || b)來說,只要a跟b有一個true,結果就反胃true。跟邏輯與一樣,如果a計算結果是true,就不會再去計算b的值直接返回true了。下面的例子一個Bool值是false,但是第二個是true,兩個與計算之後還是true,所以if通過
let hasDoorKey = falselet knowsOverridePassword = trueif hasDoorKey || knowsOverridePassword { println("Welcome!")} else { println("ACCESS DENIED")}// prints "Welcome!”
結合邏輯運算
你可以結合多個邏輯運算組成一個更長的複合陳述式
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { println("Welcome!")} else { println("ACCESS DENIED")}// prints "Welcome!”
上面例子用了多個&&和||組成了一個有點兒長的複合運算式。但是&&和||還是只能各自計算兩個值,所以實際上是三個語句連在一起,可以解釋成:
如果我們已經進入了正確的門且通過了視網膜掃描;或者如果我們有一張合法的門卡;或者如果我們認識解除緊急警報的密碼,那麼就可以進入。
通過對值enteredDoorCode,passedRetinaScan和hasDoorKey的計算,前兩個運算式的計算結果是false,但是我們知道解除警報狀態的密碼,所以說整個運算式結果還是true。
7.明確的括弧
有時候有些地方可以使用括弧也可以不用括弧,但是加上括弧能讓代碼看起來更明了。像上面的例子,給第一部分加上括弧就很有用了,代碼的意圖就很清晰
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword { println("Welcome!")} else { println("ACCESS DENIED")}// prints "Welcome!”
括弧表明了第一個與運算的結果是整體結果的一個獨立部分,加上括弧不會影響運算式計算結果,但是整體意圖變得更清晰易讀了。可讀性總是比簡潔性要重要。盡量用括弧。
本章完。下章地址5.Swift字串和字元