運(yùn)算符分為一元、二元和三元運(yùn)算符
一、賦值運(yùn)算符
- 賦值運(yùn)算符:
= - 例如: (
a = b), 表示用b的值來(lái)初始化或更新a的值
let b = 10
var a = 15
a = b
// a 現(xiàn)在等于15
- 如果賦值的右邊是一個(gè)多元組, 他的元素可以馬上分解成多個(gè)常量或變量:
let (x, y) = (1, 2)
- Swift的賦值操作并不返回任何值
if x = y {
// 此句錯(cuò)誤, 因?yàn)?x = y 并不返回任何值
}
這個(gè)特性是你無(wú)法吧(
==)錯(cuò)寫(xiě)成(=), 由于if x = y是無(wú)效的, Swift能幫你避免此類錯(cuò)誤發(fā)生
二、算術(shù)運(yùn)算符
- Swift中所有數(shù)值類型都支持了基本的四則算數(shù)運(yùn)算符
- 加法(
+)、減法(-)、乘法(*)、除法(/)
1 + 2 // 等于 3
5 - 3 // 等于 2
2 * 3 // 等于 6
10.0 / 2.5 // 等于 4.0
- Swift默認(rèn)情況下不允許在數(shù)值運(yùn)算中出現(xiàn)溢出情況
var number: Int8 = 0;
number = 128; // 報(bào)錯(cuò): Integer literal '128' overflows when stored into 'Int8'
- 加法運(yùn)算符也可用戶字符串拼接
"hello" + " " + "world" // 等于 "hello world"
三、求余運(yùn)算符
- 求余運(yùn)算符(
a % b)是計(jì)算b的多少倍剛剛好可以容入a,返回多出來(lái)的那部分(余數(shù))。
9 % 4 // 等于 1
- 在對(duì)負(fù)數(shù)
b求余時(shí),b的符號(hào)會(huì)被忽略, 這意味著a % b和a % -b的結(jié)果是相同的
let a = 9 % 4; // a 等于 1
let b = 9 % -4; // b 等于 1
四、一元負(fù)號(hào)運(yùn)算符
- 豎直的正負(fù)可以使用前綴
-來(lái)切換
let a = 3
let b = -a // b 等于 -3
let c = -b // c 等于 3
一元負(fù)號(hào)符(
-)寫(xiě)在操作數(shù)之前, 中間沒(méi)有空格
五、一元正號(hào)運(yùn)算符
- 一元正號(hào)符(
+)不做任何改變的返回操作數(shù)的值
let a = -6
let b = +a // b 等于 -6
六、組合賦值運(yùn)算符
- 組合賦值運(yùn)算符: 將基本四則運(yùn)算符和賦值運(yùn)算符組合在一起使用
- 加等(
+=)、減等(-=)、乘等(*=)、除等(/=)、余等(%=)
var a = 1
a += 2 <==> a = a + 2, a 等于 3
a -= 1 <==> a = a - 1, a 等于 2
a *= 3 <==> a = a * 3, a 等于 6
a /= 2 <==> a = a / 2, a 等于 3
a %= 2 <==> a = a % 2, a 等于 1
注意: 復(fù)合賦值運(yùn)算符沒(méi)有返回值,
let b = a += 2這類代碼是錯(cuò)誤的
七、比較運(yùn)算符
- 所有標(biāo)準(zhǔn)C語(yǔ)言中的比較運(yùn)算符都可以在Swift中使用:
- 等于(
a == b)、不等于(a != b)、大于(a > b)、小于(a < b)、大于等于(a >= b)、小于等于(a <= b)
注意
Swift也提供恒等(===)和不恒等(!==)這兩個(gè)比較符來(lái)判斷兩個(gè)對(duì)象是否引用同一個(gè)對(duì)象實(shí)例
- 每個(gè)比較運(yùn)算符都返回了一個(gè)標(biāo)識(shí)
表達(dá)式是否成立的布爾值
1 == 1 // true, 因?yàn)?1 等于 1
2 != 1 // true, 因?yàn)?2 不等于 1
2 > 1 // true, 因?yàn)?2 大于 1
1 < 2 // true, 因?yàn)?1 小于2
1 >= 1 // true, 因?yàn)?1 大于等于 1
2 <= 1 // false, 因?yàn)?2 并不小于等于 1
比較運(yùn)算多用于條件語(yǔ)句
- 如果兩個(gè)元組的元素類型相同, 且長(zhǎng)度相同的話, 元組就可以被比較。
- 比較元組大小會(huì)按照從左到右、逐值比較的方式,直到發(fā)現(xiàn)有兩個(gè)值不等時(shí)停止。
(1, "zebra") < (2, "apple") // true,因?yàn)?1 小于 2
(3, "apple") < (3, "bird") // true,因?yàn)?3 等于 3,但是 apple 小于 bird
(4, "dog") == (4, "dog") // true,因?yàn)?4 等于 4,dog 等于 dog
- 有布爾類型的元組不能被比較。
("blue", -1) < ("purple", 1) // 正常,比較的結(jié)果為 true
("blue", false) < ("purple", true) // 錯(cuò)誤,因?yàn)?< 不能比較布爾類型
注意
Swift 標(biāo)準(zhǔn)庫(kù)只能比較七個(gè)以內(nèi)元素的元組比較函數(shù)。如果你的元組元素超過(guò)七個(gè)時(shí),你需要自己實(shí)現(xiàn)比較運(yùn)算符。
八、三元運(yùn)算符
- 三元運(yùn)算符:
問(wèn)題 ? 答案1 : 答案2, 當(dāng)問(wèn)題成立, 返回答案1, 否則返回答案2 - 三元運(yùn)算符是以下代碼的縮寫(xiě)形式
if question {
answer1
} else {
answer2
}
九、空合運(yùn)算符
空合運(yùn)算符:
a ?? b對(duì)可選類型
a進(jìn)行空判斷, 如果a包含一個(gè)值就進(jìn)行解封, 否則就返回一個(gè)默認(rèn)值b。表達(dá)式a必須是 Optional 類型, 默認(rèn)值b的類型必須要和a存儲(chǔ)值的類型保持一致空合運(yùn)算符是對(duì)以下代碼的簡(jiǎn)短表達(dá)方法:
a != nil ? a! : b
注意
如果a為非空值(non-nil), 那么值b將不會(huì)被計(jì)算。這也就是所謂的短路求值
十、區(qū)間運(yùn)算符
Swift提供了幾種方便表達(dá)一個(gè)區(qū)間的值的區(qū)間運(yùn)算符
1、閉區(qū)間運(yùn)算符
- 閉區(qū)間運(yùn)算符:
a...b定義一個(gè)包含從a到b(包括a和b)的所有值的區(qū)間。a的值不能超過(guò)b - 閉區(qū)間運(yùn)算符在迭代一個(gè)區(qū)間的所有值時(shí)是非常有用的
for index in 1...5 {
print("\(index) * 5 = \(index * 5)")
}
2、半開(kāi)區(qū)間運(yùn)算符
半開(kāi)區(qū)間運(yùn)算符:
a..<b定義一個(gè)從a到b但不包含b的區(qū)間半開(kāi)區(qū)間的實(shí)用性在于當(dāng)你使用一個(gè)從 0 開(kāi)始的列表(如數(shù)組)時(shí),非常方便地從0數(shù)到列表的長(zhǎng)度。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("第 \(i + 1) 個(gè)人叫 \(names[i])")
}
3、單側(cè)區(qū)間
- 閉區(qū)間操作符有另一個(gè)表達(dá)形式, 可以表達(dá)往一側(cè)無(wú)限延伸的區(qū)間
for name in names[2...] { // 取值 2..<names.count
print(name)
}
// Brian
// Jack
for name in names[...2] { // 取值 0...2
print(name)
}
// Anna
// Alex
// Brian
單側(cè)區(qū)間不止可以在下標(biāo)里使用,也可以在別的情境下使用。你不能遍歷省略了初始值的單側(cè)區(qū)間,因?yàn)楸闅v的開(kāi)端并不明顯。你可以遍歷一個(gè)省略最終值的單側(cè)區(qū)間;然而,由于這種區(qū)間無(wú)限延伸的特性,請(qǐng)保證你在循環(huán)里有一個(gè)結(jié)束循環(huán)的分支。
你也可以查看一個(gè)單側(cè)區(qū)間是否包含某個(gè)特定的值,就像下面展示的那樣。
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
十一、邏輯運(yùn)算符
- 邏輯運(yùn)算符的操作對(duì)象是邏輯布爾值, Swift支持基于C語(yǔ)言的三個(gè)標(biāo)準(zhǔn)邏輯運(yùn)算符
- 邏輯非(
!a)、邏輯與(a && b)、邏輯或(a || b)
1、邏輯非運(yùn)算符
- 邏輯非運(yùn)算符(
!a)對(duì)一個(gè)布爾值取反, 使true變false,false變true - 他是一個(gè)前置運(yùn)算符, 需緊跟在操作數(shù)之前, 且不加空格, 讀作
非a, 例子如下
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
2、邏輯與運(yùn)算符
- 邏輯與運(yùn)算符(
a && b)表達(dá)了只有a和b的值都為true時(shí),整個(gè)表達(dá)式的值才會(huì)是true。 - 只要任意一個(gè)值為
false,整個(gè)表達(dá)式的值就為false。
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
事實(shí)上,如果第一個(gè)值為
false,那么是不去計(jì)算第二個(gè)值的,因?yàn)樗呀?jīng)不可能影響整個(gè)表達(dá)式的結(jié)果了。這被稱做短路計(jì)算
3、邏輯或運(yùn)算符
- 邏輯或運(yùn)算符(
a || b)是一個(gè)由兩個(gè)連續(xù)的|組成的中置運(yùn)算符。它表示了兩個(gè)邏輯表達(dá)式的其中一個(gè)為true,整個(gè)表達(dá)式就為true。
同邏輯與運(yùn)算符類似,邏輯或也是「短路計(jì)算」的,當(dāng)左端的表達(dá)式為
true時(shí),將不計(jì)算右邊的表達(dá)式了,因?yàn)樗豢赡芨淖冋麄€(gè)表達(dá)式的值了。
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 輸出 "Welcome!"
4、邏輯運(yùn)算符組合計(jì)算
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 輸出 "Welcome!"
如果我們輸入了正確的密碼并通過(guò)了視網(wǎng)膜掃描,或者我們有一把有效的鑰匙,又或者我們知道緊急情況下重置的密碼,我們就能把門打開(kāi)進(jìn)入。
前兩種情況,我們都不滿足,所以前兩個(gè)簡(jiǎn)單邏輯的結(jié)果是
false,但是我們是知道緊急情況下重置的密碼的,所以整個(gè)復(fù)雜表達(dá)式的值還是true。
注意
Swift 邏輯操作符 && 和 || 是左結(jié)合的,這意味著擁有多元邏輯操作符的復(fù)合表達(dá)式優(yōu)先計(jì)算最左邊的子表達(dá)式。
5、使用括號(hào)來(lái)明確優(yōu)先級(jí)
- 為了一個(gè)復(fù)雜表達(dá)式更容易讀懂,在合適的地方使用括號(hào)來(lái)明確優(yōu)先級(jí)是很有效的,雖然它并非必要的。在上個(gè)關(guān)于門的權(quán)限的例子中,我們給第一個(gè)部分加個(gè)括號(hào),使它看起來(lái)邏輯更明確:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// 輸出 "Welcome!"
- 這括號(hào)使得前兩個(gè)值被看成整個(gè)邏輯表達(dá)中獨(dú)立的一個(gè)部分。雖然有括號(hào)和沒(méi)括號(hào)的輸出結(jié)果是一樣的,但對(duì)于讀代碼的人來(lái)說(shuō)有括號(hào)的代碼更清晰??勺x性比簡(jiǎn)潔性更重要,請(qǐng)?jiān)诳梢宰屇愦a變清晰的地方加個(gè)括號(hào)吧!