基本運(yùn)算符 (Basic Operators)
自從蘋(píng)果2014年發(fā)布Swift期升,到現(xiàn)在已經(jīng)兩年多了,而Swift也來(lái)到了3.1版本扔傅。去年利用工作之余询兴,共花了兩個(gè)多月的時(shí)間把官方的Swift編程指南看完。現(xiàn)在整理一下筆記诽表,回顧一下以前的知識(shí)唉锌。有需要的同學(xué)可以去看官方文檔>>。
術(shù)語(yǔ) (Terminology)
運(yùn)算符有一元竿奏、二元和三元:
- 一元運(yùn)算符只操作一個(gè)操作數(shù)(例如
-a
)袄简。一元運(yùn)算符寫(xiě)在操作數(shù)的前面或者后面,例如!b
和c!
泛啸,并且運(yùn)算符和操作數(shù)不能有空格绿语。 - 二元運(yùn)算符操作兩個(gè)操作數(shù)(例如
2 + 3
)。 - 三元運(yùn)算符操作三個(gè)操作數(shù)。像C語(yǔ)言一樣吕粹,Swift只有一個(gè)三元運(yùn)算符伍纫,
a ? b : c
。
賦值運(yùn)算符 (Assignment Operator)
賦值運(yùn)算符用來(lái)初始化變量的值昂芜,或者更新變量的值
let b = 10
var a = 5
a = b
// a現(xiàn)在等于10
如果賦值運(yùn)算符右邊是一個(gè)有多個(gè)元素的多元組莹规,多元組的元素可以一次性分解成多個(gè)常量或者變量:
let (x, y) = (1, 2)
// x等于1,y等于2
不同于C和OC泌神,Swift中的賦值運(yùn)算符本身不返回任何值良漱。下面這個(gè)語(yǔ)句是非法的:
if x = y {
// 這是非法的,因?yàn)閤=y不返回任何值
}
算術(shù)運(yùn)算符 (Arithmetic Operators)
Swift支持下面這四個(gè)標(biāo)準(zhǔn)的算術(shù)運(yùn)算符:
- 加 (
+
) - 減 (
-
) - 乘 (
*
) - 除 (
/
)
1 + 2 // 等于 3
5 - 3 // 等于 2
2 * 3 // 等于 6
10.0 / 2.5 // 等于 4.0
另外欢际,+
可以用來(lái)拼接String
字符串:
"hello, " + "world" // 等于 "hello, world"
求余運(yùn)算符 (Remainder Operator)
9 % 4 // 等于 1
為了得出a % b
的結(jié)果母市,%
這個(gè)求余運(yùn)算符計(jì)算下面的等式,并返回remainder
:
a = (b * some multiplier(另外一個(gè)乘數(shù))) + 余數(shù)
some multiplier
是a
和b
的最大公約數(shù)损趋。
上面的計(jì)算方法同樣適用于負(fù)數(shù):
-9 % 4 // 等于 -1
把-9
和4
代入那個(gè)公式:
-9
= (4
* -2
) + -1
所以返回-1
患久。
其實(shí)b
前面的符號(hào)可以忽略,也就意味著a % b
和a % -b
的返回值是相等的浑槽。
一元減號(hào)運(yùn)算符 (Unary Minus Operator)
let three = 3
let minusThree = -3 // minusThree等于-3
let plusThree = -minusThree // plusThree等于3
一元加號(hào)運(yùn)算符 (Unary Plus Operator)
let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix等于6
一元加號(hào)運(yùn)算符不會(huì)改變操作數(shù)的值蒋失。但是為了保持對(duì)稱(chēng),在代碼中負(fù)數(shù)使用一元加號(hào)運(yùn)算符桐玻,正數(shù)也加上一元加號(hào)運(yùn)算符篙挽。
復(fù)合賦值運(yùn)算符 (Compound Assignment Operators)
var a = 1
a += 2
// a 等于 3
a += 2
其實(shí)是a = a + 2
的簡(jiǎn)寫(xiě)。
注意:復(fù)合賦值運(yùn)算符不會(huì)返回任何值镊靴,例如:我們不能這樣寫(xiě):let b = a += 2
铣卡。
比較運(yùn)算符 (Comparison Operators)
Swift支持全部C語(yǔ)言的標(biāo)準(zhǔn)運(yùn)算符:
- 等于 (
a == b
) - 不等于 (
a != b
) - 大于 (
a > b
) - 小于 (
a < b
) - 大于或等于 (
a >= b
) - 小于或等于 (
a <= b
)
注意:Swift還額外提供了恒等運(yùn)算符 (identity operator) (===
和!==
),用來(lái)判斷兩個(gè)對(duì)象是否引用同一個(gè)實(shí)例偏竟。
所有的比較運(yùn)算符都會(huì)返回一個(gè)Bool
值:
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ǔ)句煮落,例如if
語(yǔ)句:
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".
還可以用來(lái)比較多元組,只要多元組的元素個(gè)數(shù)相同踊谋,并且每個(gè)元素都是可比較的蝉仇。例如,Int
和String
都是可以比較的褪子,也就意味著多元組(Int, String)
也是可以比較的量淌。相反,Bool
是不能比較的嫌褪,所以元素中含有布爾值的多元組是不能比較的呀枢。
多元組在比較的時(shí)候,是從左到右一個(gè)一個(gè)比較笼痛,直到發(fā)現(xiàn)兩個(gè)參與比較的值不相等裙秋,那么這兩個(gè)不相等的元素的比較結(jié)果就作為兩個(gè)多元組的比較結(jié)果琅拌。如果每個(gè)元素都各自相等,那么這個(gè)多元組就相等:
(1, "zebra") < (2, "apple") // true 因?yàn)?1 is less than 2; "zebra" 和 "apple" 不用在比較
(3, "apple") < (3, "bird") // true 因?yàn)?3 等于 3, 并且 "apple" 小于 "bird"
(4, "dog") == (4, "dog") // true 因?yàn)?4 等于 4, 并且 "dog" 等于 "dog"
在上面的例子中摘刑,按照從左到右一個(gè)個(gè)比較的規(guī)則进宝,因?yàn)?code>1小于2
,所以(1, "zebra")
小于(2, "apple")
枷恕,因?yàn)橐呀?jīng)發(fā)現(xiàn)了兩個(gè)不相等的元素党晋,后面的元素將不再比較,盡管zebra
大于apple
徐块。然而未玻,當(dāng)發(fā)現(xiàn)兩個(gè)元素相等時(shí),將會(huì)繼續(xù)往下比較胡控。
注意:Swift標(biāo)準(zhǔn)庫(kù)只支持小于7個(gè)元素的多元組進(jìn)行比較扳剿。如果多元組的元素大于或等于7個(gè),我們必須自己實(shí)現(xiàn)比較運(yùn)算符昼激。
三元運(yùn)算符 (Ternary Conditional Operator)
三元運(yùn)算符是有三部分的比較特別的運(yùn)算符庇绽,格式:question ? answer1: answer2
。是下面這個(gè)代碼的簡(jiǎn)寫(xiě):
if question {
answer1
}
else {
answer2
}
例如下面這個(gè)例子:
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 等于 90
我們要避免使用三元運(yùn)算符把多個(gè)判斷條件組合在一起橙困,因?yàn)檫@會(huì)造成代碼很難讀懂瞧掺。
空合并運(yùn)算符 (Nil-Coalescing Opeartor)
使用空合并運(yùn)算符(a ?? b
)來(lái)解包一個(gè)可選類(lèi)型變量,如果a有值纷宇,返回a!
夸盟,如果為nil
,返回默認(rèn)值b
像捶。a
必須是一個(gè)可選類(lèi)型,b
的類(lèi)型必須a
包含的值類(lèi)型相同桩砰。
空合并運(yùn)算符其實(shí)是下面這個(gè)代碼的簡(jiǎn)寫(xiě):
a != nil ? a! : b
下面舉個(gè)例子:
let defaultColor = "red"
var userDefinedColorName: String? // 默認(rèn)是nil
var colorNameToUse = userDefinedColorName ?? defaultColor
// userDefinedColorName 為 nil拓春,所以 colorNameToUse被設(shè)置為默認(rèn)值 "red"
范圍運(yùn)算符 (Range Operators)
閉合范圍運(yùn)算符 (Closed Range Operator)
閉合范圍運(yùn)算符(a...b
)定義了一個(gè)從a
到b
的范圍,并且包括a
和b
亚隅,a
的值不能大于b
硼莽。
當(dāng)你想使用一個(gè)范圍的每一個(gè)值時(shí),使用閉合運(yùn)算符非常有用煮纵。例如:
for index in 1...5 {
print("\(index) 乘以 5 等于 \(index * 5)")
}
// 1 乘以 5 等于 5
// 2 乘以 5 等于 10
// 3 乘以 5 等于 15
// 4 乘以 5 等于 20
// 5 乘以 5 等于 25
半閉合運(yùn)算符 (Half-Open Range Operator)
半閉合運(yùn)算符(a..<b
)定義了一個(gè)從a
到b
的范圍懂鸵,但是不包括b
,a
的值不能大于b
行疏。如果a
等于b
匆光,那么這個(gè)范圍就是空的。
在使用下標(biāo)以0開(kāi)始的的列表酿联,例如數(shù)組终息,但是不包含數(shù)組的長(zhǎng)度夺巩,使用半閉合運(yùn)算符非常合適:
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person \(i + 1) 是 \(names[i])")
}
// Person 1 是 Anna
// Person 2 是 called Alex
// Person 3 是 called Brian
// Person 4 是 called Jack
邏輯運(yùn)算符 (Logical Operators)
Swift支持這三個(gè)標(biāo)準(zhǔn)的邏輯運(yùn)算符:
- 邏輯非 (
!a
) - 邏輯與 (
a && b
) - 邏輯或 (
a || b
)
邏輯非運(yùn)算符 (Logical NOT Operator)
邏輯非讓一個(gè)布爾值取反,true
變?yōu)?code>false周崭,false
變?yōu)?code>true柳譬。
let allowedEntry = false
if !allowedEntry {
print("拒絕訪問(wèn)")
}
// Prints "拒絕訪問(wèn)"
邏輯與運(yùn)算符 (Logical AND Operator)
邏輯與運(yùn)算符(a && b
)兩邊的邏輯語(yǔ)句都為true
時(shí),整個(gè)語(yǔ)句才是true
续镇。如果有其中一個(gè)為false
美澳,整個(gè)語(yǔ)句就為false
。實(shí)際上摸航,只要第一個(gè)語(yǔ)句是false
人柿,第二個(gè)語(yǔ)句就不會(huì)在計(jì)算了,因?yàn)榈诙€(gè)語(yǔ)句無(wú)論是true
還是false
都不可能把最終的結(jié)果改為true
忙厌。
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "ACCESS DENIED"
邏輯或運(yùn)算符 (Logical OR Operator)
邏輯或運(yùn)算符兩邊的邏輯語(yǔ)句凫岖,只要有一個(gè)是true
,那整個(gè)語(yǔ)句就是true
逢净。如果第一個(gè)語(yǔ)句是true
哥放,第二個(gè)就不會(huì)再計(jì)算。
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
組合邏輯運(yùn)算符 (Combining Logical Operators)
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
在這個(gè)例子中爹土,使用多個(gè)&&
和||
運(yùn)算符來(lái)創(chuàng)建一個(gè)更長(zhǎng)的復(fù)合語(yǔ)句甥雕。但是&&
和||
運(yùn)算符還是僅僅操作兩個(gè)邏輯語(yǔ)句。上面的代碼可以這么讀:如果我們輸入了正確的門(mén)密碼并且通過(guò)了視網(wǎng)膜掃描胀茵,或者有門(mén)鑰匙社露,或者我們知道緊急覆蓋密碼,那么就允許進(jìn)入琼娘。
明確的括號(hào) (Explicit Parentheses)
在恰當(dāng)?shù)奈恢眉由侠ㄌ?hào)峭弟,增強(qiáng)代碼的易讀性:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// Prints "Welcome!"
第二部分完。下個(gè)部分:【Swift 3.1】03 - 字符串和字符 (Strings and Characters)
如果有錯(cuò)誤的地方脱拼,歡迎指正瞒瘸!謝謝!