Swift:基本運(yùn)算符

Swift中文文檔

運(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 % ba % -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è)從ab但不包含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è)布爾值取反, 使truefalse, falsetrue
  • 他是一個(gè)前置運(yùn)算符, 需緊跟在操作數(shù)之前, 且不加空格, 讀作非a, 例子如下
let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// 輸出 "ACCESS DENIED"
2、邏輯與運(yùn)算符
  • 邏輯與運(yùn)算符(a && b)表達(dá)了只有 ab 的值都為 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)吧!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 運(yùn)算符是檢查、改變、合并值的特殊符號(hào)或短語(yǔ)。例如,加號(hào)+將兩個(gè)數(shù)相加(如let i = 1 + 2)。更復(fù)雜的運(yùn)算...
    窮人家的孩紙閱讀 15,052評(píng)論 3 6
  • 術(shù)語(yǔ) 運(yùn)算符分為一元,二元,三元運(yùn)算符 一元運(yùn)算符對(duì)單一操作對(duì)象進(jìn)行操作(如-a),一元運(yùn)算符又分前置前置運(yùn)算符和...
    edison0428閱讀 568評(píng)論 0 0
  • 賦值運(yùn)算符 賦值運(yùn)算符(a = b),表示用 b 的值來(lái)初始化或更新 a 的值: 算術(shù)運(yùn)算符 Swift 中所有數(shù)...
    小驢拉磨閱讀 395評(píng)論 0 0
  • How was the job interview? She did well but she is so una...
    Noah_M閱讀 6,363評(píng)論 7 21
  • 每一陣風(fēng)撫過(guò) 我知道我又將離你遠(yuǎn)去 直到 山坡不見(jiàn)了 蟲(chóng)鳴也安靜了 我知道,風(fēng)不會(huì)駐足 它還有沒(méi)完成的流浪 每一場(chǎng)...
    微涼_Elena閱讀 413評(píng)論 4 7

友情鏈接更多精彩內(nèi)容