2_基本運算符

賦值運算符 =

let b = 10
var a = 5
let (x, y) = (1, 2)
// 現(xiàn)在 x 等于 1,y 等于 2
if x = y {
    // 此句錯誤,因為 x = y 并不返回任何值
}

這個特性使你無法把(==)錯寫成(=),由于 if x = y 是錯誤代碼,Swift 能幫你避免此類錯誤發(fā)生。

算術(shù)運算符 +,-*,/

與 C 語言和 Objective-C 不同的是,Swift 默認情況下不允許在數(shù)值運算中出現(xiàn)溢出情況。但是你可以使用 Swift 的溢出運算符來實現(xiàn)溢出運算(如 a &+ b)。

加法運算符也可用于 String 的拼接:

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

求余運算符 %

9 % 4    // 等于 1
-9 % 4   // 等于 -1

一元負號運算符 -

let three = 3
let minusThree = -three       // minusThree 等于 -3
let plusThree = -minusThree   // plusThree 等于 3, 或 "負負3"

一元正號運算符 +

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

組合賦值運算符

+=-=,*=,\=

var a = 1
a += 2
// a 現(xiàn)在是 3

注意:
復(fù)合賦值運算沒有返回值,let b = a += 2這類代碼是錯誤。這不同于上面提到的自增和自減運算符。

比較運算符(Comparison Operators)

==,!=,><>=,<====,!==

注意:
Swift 也提供恒等(===)和不恒等(!==)這兩個比較符來判斷兩個對象是否引用同一個對象實例。

元組比較,需要兩個元組的元素相同,且長度相同。比較元組大小按從左到右、逐值比較的方式,直到發(fā)現(xiàn)有兩個值不等時停止。如果所有的值都相等,那么這一對元組我們就稱它們是相等的。例如:

(1, "zebra") < (2, "apple")   // true,因為 1 小于 2
(3, "apple") < (3, "bird")    // true,因為 3 等于 3,但是 apple 小于 bird
(4, "dog") == (4, "dog")      // true,因為 4 等于 4,dog 等于 dog

可以比較兩個類型為 (String, Int) 的元組,因為 IntString 類型的值可以比較。相反,Bool 不能被比較,也意味著存有布爾類型的元組不能被比較。

("blue", -1) < ("purple", 1)       // 正常,比較的結(jié)果為 true
("blue", false) < ("purple", true) // 錯誤,因為 < 不能比較布爾類型

注意:
Swift 標準庫只能比較七個以內(nèi)元素的元組比較函數(shù)。如果你的元組元素超過七個時,你需要自己實現(xiàn)比較運算符。

三目運算符(Ternary Conditional Operator)

a ? b : c

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight 現(xiàn)在是 90

空合運算符(Nil Coalescing Operator)

空合運算符a ?? b)將對可選類型 a 進行空判斷,如果 a 包含一個值就進行解封,否則就返回一個默認值 b。表達式 a 必須是 Optional 類型。默認值 b 的類型必須要和 a 存儲值的類型保持一致。

空合運算符是對以下代碼的簡短表達方法:

a != nil ? a! : b

上述代碼使用了三目運算符。當可選類型 a 的值不為空時,進行強制解封(a!),訪問 a 中的值;反之返回默認值 b。無疑空合運算符(??)提供了一種更為優(yōu)雅的方式去封裝條件判斷和解封兩種行為,顯得簡潔以及更具可讀性。

注意:
如果 a 為非空值(non-nil),那么值 b 將不會被計算。這也就是所謂的短路求值。

let defaultColorName = "red"
var userDefinedColorName: String?   //默認值為 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值為空,所以 colorNameToUse 的值為 "red"

區(qū)間運算符(Range Operators)

  • 閉區(qū)間運算符
    a...b (a <= x <= b)
  • 半開區(qū)間運算符
    a..<b (a <= x < b)
for i in 0...5 {
    // 0,1,2,3,4,5
}
for i in 0..<5 {
    // 0,1,2,3,4
}
  • 單側(cè)區(qū)間
    [a...] [...a] [..<a]
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names[2...] {
    print(name)
}
// Brian
// Jack
 
for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian
for name in names[..<2] {
    print(name)
}
// Anna
// Alex

單側(cè)區(qū)間不止可以在下標里使用,也可以在別的情境下使用。你不能遍歷省略了初始值的單側(cè)區(qū)間,因為遍歷的開端并不明顯。你可以遍歷一個省略最終值的單側(cè)區(qū)間;然而,由于這種區(qū)間無限延伸的特性,請保證你在循環(huán)里有一個結(jié)束循環(huán)的分支。你也可以查看一個單側(cè)區(qū)間是否包含某個特定的值:

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

邏輯運算符(Logical Operators)

  • 邏輯非(!a
  • 邏輯與(a && b
  • 邏輯或(a || b
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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