Swift--基本運算子

weixin_34393428發表於2017-10-25

文章摘要

  • 1、運算子

注意點

  • 加法可以用於 String 的拼接
  • ===, !== 判斷兩個物件是否為同一個物件例項
  • Swift 標準庫只能比較七個以內元素的元組比較函式
  • 空合運算子(a ?? b)將對可選型別 a 進行空判斷,如果 a 包含一個值就進行解封,否則就返回一個預設值 b。表示式 a 必須是 Optional 型別。預設值 b 的型別必須要和 a 儲存值的型別保持一致。
  • a...b a ..< b names[2...] names[...2] names[..<2]

-------正文-------

//運算子是檢查、改變、合併值的特殊符號或短語。

術語

//一元、二元、三元運算子 運算元

  • 一元運算子對單一操作物件操作(如 -a)。一元運算子分前置運算子和後置運算子,前置運算子需緊跟在操作物件之前(如 !b),後置運算子需緊跟在操作物件之後(如 c!)。
  • 二元運算子操作兩個操作物件(如 2 + 3),是中置的,因為它們出現在兩個操作物件之間。
  • 三元運算子操作三個操作物件,和 C 語言一樣,Swift 只有一個三元運算子,就是三目運算子(a ? b : c)。
    受運算子影響的值叫運算元,

賦值運算子 =

 let b = 10
 var a = 5
 a = b
 let (x, y) = (1, 2)

//與 C 語言和 Objective-C 不同,Swift 的賦值操作並不返回任何值。

 //if x = y {
 //    //此句錯誤,因為 x = y 並不返回值
 //}

算數運算子

  • 加法(+)
  • 減法(-)
  • 乘法(*)
  • 除法(/)
 1 + 2
 5 - 3
 2 * 3
 10.0 / 2.5

Swift 預設情況下不允許在數值運算中出現溢位情況:a &+ b
加法可以用於 String 的拼接

 "hello, " + "world"

求餘運算子

求餘運算子(a % b)是計算 b 的多少倍剛剛好可以容入a,返回多出來的那部分(餘數)。

 9 % 4
 -9 % 4

一元負號運算子 -

字首 負號(即一元負號符),與數字之間沒有空格

 let three = 3
 let minusThree = -three
 let plusThree =  -minusThree

一元正號運算子 +

一元正號符(+)不做任何改變地返回運算元的值:

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

組合賦值運算子 +=

 a = 1
 a += 2 // a = a + 2
 a -= 2
 a /= 2
 a *= 3
  • 複合賦值運算沒有返回值,let b = a += 2這類程式碼是錯誤。這不同於上面提到的自增和自減運算子。

比較運算子 Comparison Operators

a = b, a != b, a > b, a < b, a >= b, a <= b
===, !== 判斷兩個物件是否為同一個物件例項

 1 == 1
 2 != 1
 2 > 1
 2 < 2
 1 < 2
 1 >= 1
 2 <= 1

 let name = "world"
 if name == "world" {
 print("hello, world")
 } else {
 print("I'm sorry \(name),but I don't recognize you")
 }

如果兩個元組的元素相同,且長度相同的話,元組就可以被比較。
/元組比較 比較元組大小會按照從左到右、逐值比較的方式,直到發現有兩個值不等時停止。如果所有的值都相等,那麼這一對元組我們就稱它們是相等的

 (1, "zebra") < (2, "apple")
 (3, "apple") < (3, "bird")
 (4, "dog") == (4, "dog")

("blue", -1) < ("purple", 1)       // 正常,比較的結果為 true
("blue", false) < ("purple", true) // 錯誤,因為 < 不能比較布林型別
  • Swift 標準庫只能比較七個以內元素的元組比較函式。如果你的元組元素超過七個時,你需要自己實現比較運算子。

三目運算子 (Ternary Conditonal Operator)

問題 ?答案1 : 答案2

 if question {
     answer1
 } else {
     answer2
 }

 let contentHeight = 40
 let hasHeader = true
 var rowHeight = contentHeight + (hasHeader ? 50 : 20)
 
 rowHeight = contentHeight
 if hasHeader {
 rowHeight = rowHeight + 50
 } else {
 rowHeight = rowHeight + 20
 }

空合運算子(Nil Coalescing Operator) a ?? b

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

 //a != nil ? a! : b   //短路求知
 let defaultColorName = "red"
 var userDefinedColorName: String? //預設為nil

 var colorNameToUse = userDefinedColorName ?? defaultColorName
 userDefinedColorName = "green"
 colorNameToUse = userDefinedColorName ?? defaultColorName

區間運算子 Range Operators

閉區間運算子 a...b //從 a 到 b 包含 a 和 b

 for index in 1...5 {
     print("\(index) * 5 = \(index * 5)")
 }

半開區間運算子 a ..< b //從 a 到 b 但不包含 b

 let names = ["Anna", "Alex", "Brian", "Jack"]
 let count = names.count
 for i in 0..<count {
     print("第\(i + 1) 個人叫 \(names[i])")
 }

單側區間

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

//檢視一個單側區間是否包含某個特定的值
let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

邏輯運算子 Logical Operators

邏輯非 !a

 let allowedEntry = false
 if !allowedEntry {
 print("ACCESS DENIED")
 }

邏輯與 a && b

 let enterDoorCode = true
 let passedRetinaScan = false
 if enterDoorCode && passedRetinaScan {
 print("Welcome!")
 } else {
 print("ACCESS DENIED")
 }

邏輯或 a || b

 let hasDoorKey = false
 let knowsOveridePassword = true
 if hasDoorKey || knowsOveridePassword {
 print("Welcome")
 } else {
 print("ACCESS DENIED")
 }

邏輯運算子組合計算

 if enterDoorCode && passedRetinaScan || hasDoorKey || knowsOveridePassword {
 print("Welcome")
 } else {
 print("ACCESS DENIED")
 }

使用括號來明確優先順序

 if (enterDoorCode && passedRetinaScan) || hasDoorKey || knowsOveridePassword {
 print("Welcome")
 } else {
 print("ACCESS DENIED")
 }
  • Swift 邏輯操作符 && 和 || 是左結合的,這意味著擁有多元邏輯操作符的複合表示式優先計算最左邊的子表示式。

相關文章