【Swift 3.1】02 - 基本運(yùn)算符 (Basic Operators)

基本運(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ù)的前面或者后面,例如!bc!泛啸,并且運(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 multiplierab的最大公約數(shù)损趋。

上面的計(jì)算方法同樣適用于負(fù)數(shù):

-9 % 4 // 等于 -1

-94代入那個(gè)公式:

-9 = (4 * -2) + -1

所以返回-1患久。

其實(shí)b前面的符號(hào)可以忽略,也就意味著a % ba % -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è)元素都是可比較的蝉仇。例如,IntString都是可以比較的褪子,也就意味著多元組(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è)從ab的范圍,并且包括ab亚隅,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è)從ab的范圍懂鸵,但是不包括ba的值不能大于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ò)誤的地方脱拼,歡迎指正瞒瘸!謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熄浓,一起剝皮案震驚了整個(gè)濱河市情臭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赌蔑,老刑警劉巖俯在,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異娃惯,居然都是意外死亡跷乐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)石景,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劈猿,“玉大人拙吉,你說(shuō)我怎么就攤上這事【救伲” “怎么了筷黔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)仗颈。 經(jīng)常有香客問(wèn)我佛舱,道長(zhǎng),這世上最難降的妖魔是什么挨决? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任请祖,我火速辦了婚禮,結(jié)果婚禮上脖祈,老公的妹妹穿的比我還像新娘肆捕。我一直安慰自己,他們只是感情好盖高,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布慎陵。 她就那樣靜靜地躺著,像睡著了一般喻奥。 火紅的嫁衣襯著肌膚如雪席纽。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天撞蚕,我揣著相機(jī)與錄音润梯,去河邊找鬼甥厦。 笑死纺铭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矫渔。 我是一名探鬼主播彤蔽,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庙洼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起镊辕,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤油够,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后征懈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體石咬,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年卖哎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬼悠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片删性。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖焕窝,靈堂內(nèi)的尸體忽然破棺而出蹬挺,到底是詐尸還是另有隱情,我是刑警寧澤它掂,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布巴帮,位于F島的核電站,受9級(jí)特大地震影響虐秋,放射性物質(zhì)發(fā)生泄漏榕茧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一客给、第九天 我趴在偏房一處隱蔽的房頂上張望用押。 院中可真熱鬧,春花似錦靶剑、人聲如沸蜻拨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官觅。三九已至,卻和暖如春阐污,著一層夾襖步出監(jiān)牢的瞬間休涤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工笛辟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留功氨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓手幢,卻偏偏與公主長(zhǎng)得像捷凄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子围来,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容