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)
譯者心聲
我們會(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..<b
和a...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ù)是1
和2
躬拢。
賦值運(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
把9
和4
放入等式中
9 = (4 * 2) + 1
相同的方法掉房,可以計(jì)算負(fù)數(shù)
-9 % 4 // 等于-1
把-9
和4
放入等式可以得到
-9 = (4 * -2) + -1
余數(shù)是-1
對于負(fù)數(shù)b
求余的時(shí)候,b
的符號會(huì)被忽略慰丛,意味著a % b
和a % -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 += 2
是 a = 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ù)量值的元祖。比如:Int
和String
都可以比較,這意味著類型(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)算符的情況杭煎。