賦值運算符 =
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) 的元組,因為 Int 和 String 類型的值可以比較。相反,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)