Swift 4官方文檔中文版: Basic Operators(上)

Swift學(xué)習(xí)有問必答群 : 313838956 ( mac版QQ有權(quán)限要求, 入群只能通過手機(jī)版 QQ申請). 本群由Guards翻譯組創(chuàng)建并維護(hù)
入群須知:

0.0 重申: mac版QQ有權(quán)限要求, 入群只能通過手機(jī)版 QQ申請.
0.1 群主晚上每天20點(diǎn)--21點(diǎn)定時(shí)回答Swift相關(guān)的問題.
0.2 群主會(huì)在看到問題后, 第一時(shí)間回復(fù)
0.3 拒絕長時(shí)間潛水, 拒絕討論和Swift , iOS 無關(guān)的問題



該文章翻譯自Apple官方文檔: The Swift 4 Programming Language

Guards翻譯組 正在翻譯Swift 4的全套文檔, 這是該文檔第二章節(jié)《Basic Operators》的上半部分, 第一章節(jié)《The Basics》 上半部分請點(diǎn)這里/下半部分請點(diǎn)這里, 原文鏈接: Basic Operators

翻譯 : Stevin三天三夜 (Blog / GitHub)

校對 : Jonhory (簡書 / GitHub)

譯者心聲

我們會(huì)不定期的更新翻譯文章, Guards翻譯組本周四18:00會(huì)發(fā)布 Basic Operators下半部分 章節(jié)中文版. 如感興趣,可以關(guān)注我們的簡書

我們是一群熱愛翻譯并且熱愛 Swift 的人会喝, 希望通過自己的努力讓不熟悉英語的程序員也能學(xué)習(xí)到國外的高質(zhì)量的文章. 如發(fā)現(xiàn)文章中翻譯錯(cuò)誤之處, 煩請跟我們聯(lián)系, 我們第一時(shí)間更正.

本篇包含內(nèi)容:

  • 基本運(yùn)算符
  • 術(shù)語
  • 賦值運(yùn)算符
  • 算數(shù)運(yùn)算符
  • 求余運(yùn)算符
  • 一元減號運(yùn)算符
  • 一元加號操作符
  • 復(fù)合賦值運(yùn)算符
  • 比較運(yùn)算符
  • 三元條件運(yùn)算

基本運(yùn)算符

運(yùn)算符是檢查赦肋,改變或合并值的特殊符號和短語淋昭。比如:加號(+)是將兩個(gè)數(shù)相加逛漫,如
let i = 1 + 2,和邏輯AND元運(yùn)算符(&&)結(jié)合兩兩個(gè)布爾值匪煌,比如:if enteredDoorCode && passedRetinaScan稽揭。

Swift支持多數(shù)標(biāo)準(zhǔn) C 操作符,并且為了消除常見的編碼錯(cuò)誤改進(jìn)了幾種特性浪蹂。例如:賦值運(yùn)算符(=)沒有返回值抵栈。防止當(dāng)使用判等運(yùn)算符(==)的地方錯(cuò)誤地使用它。算術(shù)運(yùn)算符(+坤次,-古劲,*%等)檢測不允許值溢出缰猴,來避免保存變量的時(shí)候變量取值范圍大于或小于其取值范圍導(dǎo)致的異常結(jié)果产艾。你也可以使用Swift的溢出運(yùn)算符實(shí)現(xiàn)溢出,詳見Overflow Operators洛波。

Swift還提供了 C 沒有的區(qū)間運(yùn)算符胰舆,比如:a..<ba...b,快捷地表達(dá)了區(qū)間內(nèi)的數(shù)值骚露。

本章描述了Swift常見的運(yùn)算符蹬挤,Advanced Operators這章涵蓋了Swift的高級運(yùn)算符,并且介紹如何自定義運(yùn)算符和標(biāo)準(zhǔn)實(shí)現(xiàn)運(yùn)算符自定義類型棘幸。

術(shù)語

運(yùn)算符有一元運(yùn)算符焰扳、二元運(yùn)算符和三元運(yùn)算符。

  • 一元運(yùn)算符針對單個(gè)對象操作误续,比如-a吨悍,一元運(yùn)算符分為前置運(yùn)算符和后置運(yùn)算符,前置運(yùn)算符的運(yùn)算符在對象前面蹋嵌,如!b,后置運(yùn)算符的運(yùn)算符在對象后面育瓜,如c!.
  • 二元運(yùn)算符操作兩個(gè)對象,如2 + 3栽烂,是放在中間的躏仇,出現(xiàn)在兩個(gè)運(yùn)算對象之間。
  • 三元運(yùn)算符操作三個(gè)對象腺办,像C語言一樣焰手,Swift只有一個(gè)三元運(yùn)算符,條件運(yùn)算符a ? b : c.

運(yùn)算符影響的值叫操作數(shù)怀喉,在表達(dá)式1 + 2中书妻,+是二元運(yùn)算符,它的兩個(gè)操作數(shù)是12躬拢。

賦值運(yùn)算符

賦值運(yùn)算符a = b)用b的值初始化或更新了a的值:

let b = 10
var a = 5
a = b
// 此時(shí) a 等于10

如果賦值的右邊是一個(gè)多元組躲履,那它的元素被分成多個(gè)常量或變量:

let (x, y) = (1, 2)
// 此時(shí) x 等于 1见间,y 等于 2

Swift的賦值操作符不同于 C 和 Objective-C, 它沒有返回值,所以下面的代碼是錯(cuò)誤的:

if x = y {
    // 這是錯(cuò)誤的崇呵,因?yàn)閤 = y沒有返回值
}

這個(gè)特性能夠防止你使用(==)的時(shí)候而錯(cuò)誤的寫成(=)缤剧,因?yàn)?code>if x = y是無效的,Swift能夠幫助你避免這種類型錯(cuò)誤的發(fā)生域慷。

算數(shù)運(yùn)算符

Swift支持所有數(shù)值類型的常見四則運(yùn)算

  • 加法(+
  • 減法(-
  • 乘法(*
  • 除法(/
1 + 2           // 等于3
5 - 3           // 等于2
2 * 3           // 等于6
10.0 / 2.5      //等于4.0

Swift的算數(shù)運(yùn)算符不同于 C 和 Objective-C 的是默認(rèn)情況下不允許溢出荒辕。你可以使用Swift的溢出運(yùn)算符進(jìn)行溢出運(yùn)算(如:a &+ b),詳見Overflow Operators.

加法運(yùn)算符也支持String的拼接

"hello, " + "world"     // 等于 “hello, world”

求余運(yùn)算符

求余運(yùn)算符a % b)計(jì)算出b的多少倍恰好合適a并且返回剩余的值(稱作余數(shù)

NOTE:

在其他語言中求余運(yùn)算符也叫做取模運(yùn)算符犹褒,然而嚴(yán)格的來說在Swift中它對負(fù)數(shù)的操作行為抵窒,它是一個(gè)余數(shù)而非取模榄鉴。

求余計(jì)算的方式焚刺,計(jì)算9 % 4,你先計(jì)算出多少個(gè)4恰好適合9

[圖片上傳失敗...(image-df1cc8-1516086986596)]

兩個(gè)4恰好適合9肴沫,余數(shù)是1(橙色部分顯示)

在Swift中表達(dá)為:

9 % 4       // 等于1

為了得到a % b的答案宙枷,%運(yùn)算符計(jì)算了以下等式并且返回余數(shù)作為結(jié)果:

a = (b * 倍數(shù)) + 余數(shù)

當(dāng)倍數(shù)取到最大值的時(shí)候乘上b就恰好適合a

94放入等式中

9 = (4 * 2) + 1

相同的方法掉房,可以計(jì)算負(fù)數(shù)

-9 % 4      // 等于-1

-94放入等式可以得到

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

余數(shù)是-1
對于負(fù)數(shù)b求余的時(shí)候,b的符號會(huì)被忽略慰丛,意味著a % ba % -b結(jié)果是一樣的卓囚。

一元減號運(yùn)算符

數(shù)值的符號可以切換使用前綴-,稱為一元減號運(yùn)算符

let three = 3
let minusThree = -three         //minusThree等于-3
let plusThree = -minusThree //plusThree等于3诅病,或“負(fù)負(fù)3”

一元減號(-)直接在操作數(shù)之前哪亿,中間沒有任何空格

一元加號操作符

一元加號操作符+)只是簡單地返回了操作數(shù)的值,沒有做任何改變

let minusSix = -6
let alsoMinusSix = +minusSix        //alsoMinusSix等于-6

盡管一元加號操作符實(shí)際上沒有做任何事情贤笆,但當(dāng)你使用一元減號操作符的時(shí)候可以使用它來為提供代碼提供對稱性蝇棉。

復(fù)合賦值運(yùn)算符

想C一樣,Swift也提供把賦值運(yùn)算符(=)和其他運(yùn)算符結(jié)合起來的復(fù)合賦值運(yùn)算符芥永,比如說其中的加法賦值運(yùn)
算符
+=

var a = 1
a += 2
a 現(xiàn)在等于 3

表達(dá)式a += 2a = a + 2的簡寫篡殷,有限地將加法和賦值合成一個(gè)運(yùn)算符同時(shí)執(zhí)行兩項(xiàng)任務(wù)

NOTE

復(fù)合賦值運(yùn)算符沒有返回值,比如說你不能這樣寫:let b = a += 2

對了,Swift提供的標(biāo)準(zhǔn)庫提供的復(fù)合賦值操作符完整列表埋涧,詳見Swift Standard Library Operators Reference板辽。

比較運(yùn)算符

Swift支持所有標(biāo)準(zhǔn) C 語言中的比較運(yùn)算符

  • 等于(a == b
  • ?不等于(a != b
  • 大于(a > b
  • 小于(a < b
  • 大于等于(a >= b
  • 小于等于(a <= b

NOTE

Swift也提供了恒等(===)和不恒等(!==)兩個(gè)比較符用于測試兩個(gè)對象是否引用同一個(gè)對象的實(shí)例,更多信息詳見Classes and Structures.

每個(gè)比較運(yùn)算符都返回了一個(gè)布爾值來標(biāo)識語句是否為真

1 == 1      //為真飞袋,因?yàn)?等于1
2 != 1      //為真戳气,因?yàn)?不等于1
2 > 1       //為真,因?yàn)?大于1
1 < 2       //為真巧鸭,因?yàn)?小于2
1 >= 1      //為真瓶您,因?yàn)?大于或小于1
2 <= 1      //為假,2并不小于或等于1

比較運(yùn)算符經(jīng)常用于條件語句,比如if語句

let name = "world"
if name == "world" {
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// 輸出“hello world”,因?yàn)閚ame確實(shí)等于“world”

更多短語if語句呀袱,詳見Control Flow
只要元組中的每個(gè)值都相同贸毕,你也可以比較相同數(shù)量值的元祖。比如:IntString都可以比較,這意味著類型(Int,String)類型的元組可以比較夜赵,相反明棍,布爾值不能比較,這意味著包含布爾值的元祖不能比較寇僧。
元組的比較從左到右摊腋,每次比較一個(gè)值,直到比較發(fā)現(xiàn)兩個(gè)值不相等嘁傀,比較完這兩個(gè)值兴蒸,比較的結(jié)果決定了元組比較的總體結(jié)果,如果每個(gè)元素都相等细办,那么元組本身也相等橙凳,比如:

(1, "zebra") < (2, "apple")   //為真,因?yàn)?小于2;“zebra”和“apple”不比較
(3, "apple") < (3, "bird")    //為真笑撞,因?yàn)?等于3;“apple”小于“bird”
(4, "dog") == (4, "dog")      //為真, 因?yàn)?等于4;"dog"等于"dog"

在上面的示例中岛啸,第一行左右比較的行為,因?yàn)?code>1小于2茴肥,就決定(1, "zebra")小于(2, "apple")坚踩,而不去考慮元組中的其它值,”zebra“不小于”apple“并不重要炉爆,因?yàn)樵娴牡谝粋€(gè)元素已經(jīng)決定了比較結(jié)果堕虹,然而卧晓,當(dāng)元組的第一個(gè)元素相同的時(shí)候芬首,就像第二行和第三行一樣,比較他們的第二個(gè)元素逼裆。

NOTE

Swift標(biāo)準(zhǔn)庫包含了少于7個(gè)元素的元組比較運(yùn)算符郁稍,七個(gè)或更多元素的元祖比較時(shí),你必須自己實(shí)現(xiàn)比較運(yùn)算胜宇。

三元條件運(yùn)算

三元條件運(yùn)算符的特殊性在于它有三部分操作數(shù)耀怜,像:問題答案1 : 答案2桐愉,這個(gè)基于問題真或假?zèng)Q定兩個(gè)表達(dá)式中選出一個(gè)的簡潔操作财破。如果問題為真,則返回值為答案1,否則从诲,返回值為答案2.
三元條件操作符簡短地描述了下面的代碼

if question {
    answer1
} else {
    answer2
}

這有一個(gè)計(jì)算表行高的例子左痢,如果有表頭,行高應(yīng)該高于內(nèi)容50像素,如果沒有表頭俊性,高于內(nèi)容20像素略步。

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// 行高等于90

前面的例子要比下面的代碼簡潔

let contentHeight = 40
let hasHeader = true
let rowHeight: Int
if hasHeader {
    rowHeight = contentHeight + 50
} else {
    rowHeight = contentHeight + 20
}
// 行高等于90

第一個(gè)例子使用了三元條件運(yùn)算符一行代碼就能算出rowHeight,這比第二個(gè)例子的代碼更簡潔。
三元條件運(yùn)算符為需要考慮的兩個(gè)表達(dá)式提供了高效的簡寫定页,然而趟薄,使用三元條件運(yùn)算符也需要謹(jǐn)慎。過度使用會(huì)導(dǎo)致簡潔的代碼變的很難讀懂典徊。避開的一個(gè)組合語句中使用多個(gè)三元條件運(yùn)算符的情況杭煎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卒落,隨后出現(xiàn)的幾起案子岔帽,更是在濱河造成了極大的恐慌,老刑警劉巖导绷,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀勒,死亡現(xiàn)場離奇詭異,居然都是意外死亡妥曲,警方通過查閱死者的電腦和手機(jī)贾费,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檐盟,“玉大人褂萧,你說我怎么就攤上這事】” “怎么了导犹?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長羡忘。 經(jīng)常有香客問我谎痢,道長,這世上最難降的妖魔是什么卷雕? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任节猿,我火速辦了婚禮,結(jié)果婚禮上漫雕,老公的妹妹穿的比我還像新娘滨嘱。我一直安慰自己,他們只是感情好浸间,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布太雨。 她就那樣靜靜地躺著,像睡著了一般魁蒜。 火紅的嫁衣襯著肌膚如雪囊扳。 梳的紋絲不亂的頭發(fā)上煤墙,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音宪拥,去河邊找鬼仿野。 笑死,一個(gè)胖子當(dāng)著我的面吹牛她君,可吹牛的內(nèi)容都是我干的脚作。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缔刹,長吁一口氣:“原來是場噩夢啊……” “哼球涛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起校镐,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤亿扁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸟廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體从祝,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年引谜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牍陌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡员咽,死狀恐怖毒涧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贝室,我是刑警寧澤契讲,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站滑频,受9級特大地震影響捡偏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜误趴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一霹琼、第九天 我趴在偏房一處隱蔽的房頂上張望务傲。 院中可真熱鬧凉当,春花似錦、人聲如沸售葡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挟伙。三九已至楼雹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贮缅。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工榨咐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谴供。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓块茁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桂肌。 傳聞我的和親對象是個(gè)殘疾皇子数焊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

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