Basic Operators (基本運算符)

//基本運算符

//“運算符是檢查、改變、合并值的特殊符號或短語”
/*
總覽:
1.“Swift 支持大部分標準 C 語言的運算符,且改進許多特性來減少常規編碼錯誤。”
2.“賦值符(=)不返回值,以防止把想要判斷相等運算符(==)的地方寫成賦值符導致的錯誤。”
3.“算術運算符(+,-,*,/,%等)會檢測并不允許值溢出,”
4.“Swift 還提供了 C 語言沒有的表達兩數之間的值的區間運算符(a..<b 和 a...b)”
*/

//1. 術語
//“運算符分為一元、二元和三元運算符:
//一元運算符對單一操作對象操作(如 -a)。一元運算符分前置運算符和后置運算符,前置運算符需緊跟在操作對象之前(如 !b),后置運算符需緊跟在操作對象之后(如 c!)。
//二元運算符操作兩個操作對象(如 2 + 3),是中置的,因為它們出現在兩個操作對象之間
//“三元運算符操作三個操作對象,和 C 語言一樣,Swift 只有一個三元運算符,就是三目運算符(a ? b : c)。”

//2. 賦值運算符

//“賦值運算符(a = b),表示用 b 的值來初始化或更新 a 的值:
let b = 10
var a = 5
a = b
// a 現在等于 10”
//“如果賦值的右邊是一個多元組,它的元素可以馬上被分解成多個常量或變量:”
let(x,y)=(1,3)
//現在x等于1, y等于3
// “與 C 語言和 Objective-C 不同,Swift 的賦值操作并不返回任何值。所以以下代碼是錯誤的:”
//if x=y {
//  // 此句錯誤,因為 x=y不返回任何值
//}

//3. 算術運算符
// + - * / 加減乘除4個
//“Swift 默認情況下不允許在數值運算中出現溢出情況。但是你可以使用 Swift 的溢出運算符來實現溢出運算(如 a &+ b)”

//加法可以用于String拼接
let addStr = "hello," + "world"

//4. 求余運算符
// “求余運算符(a % b)是計算 b 的多少倍剛剛好可以容入a,返回多出來的那部分(余數)。

9%4 //等于1
//9 = (4*2) + 1

-9%4 // 等于-1
// -9 = (4*-2)+ -1

//“在對負數 b 求余時,b 的符號會被忽略。這意味著 a % b 和 a % -b 的結果是相同的。

//5.組合賦值運算符

var m = 1
m+=2
// 相當于 m=m+2的簡寫。 

//6. 比較運算符
//“每個比較運算都返回了一個標識表達式是否成立的布爾值,“比較運算多用于條件語句”

/*
等于(a == b)
不等于(a != b)
大于(a > b)
小于(a < b)
大于等于(a >= b)
小于等于(a <= b)
*/

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

//“當元組中的值可以比較時,你也可以使用這些運算符來比較它們的大小”“比較元組大小會按照從左到右、逐值比較的方式,直到發現有兩個值不等時停止。如果所有的值都相等,那么這一對元組我們就稱它們是相等的”

(1,"zebra") < (2,"apple")
(3,"bard") < (3,"apple")

//7. 三目運算符
//“三目運算符的特殊在于它是有三個操作數的運算符,它的形式是 問題 ? 答案 1 : 答案 2。它簡潔地表達根據 問題成立與否作出二選一的操作。如果 問題 成立,返回 答案 1 的結果;反之返回 答案 2 的結果。”

let contenHeight = 40
let hasHeader = true
let rowHeigth = contenHeight + (hasHeader ? 50 : 20)

//8.空合運算符 (nil coalescing operator) *** 重要

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

//空合運算符是對一下代碼的簡短表達
//   a != nil? a! : b

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

//注意:當a的值不是空的時候,那么值b將不會被計算,這就是所謂的短路求值。

let defaultColor = "red"
var userDefinedColor: String?
var colorNameToUse = userDefinedColor ?? defaultColor
// 如果可選值有值,相當于解包并賦值給colorNameToUse

// 9. 區間運算符 (range Operators)
//閉區間運算符

//“閉區間運算符(a...b)定義一個包含從 a 到 b(包括 a 和 b)的所有值的區間。a 的值不能超過 b”
for index in 1...5{
print("\(index)*5=\(index*5)")
}

//半開區間運算符

//“半開區間運算符(a..<b)定義一個從 a 到 b 但不包括 b 的區間。 之所以稱為半開區間,是因為該區間包含第一個值而不包括最后的值。半開區間的實用性在于當你使用一個從 0 開始的列表(如數組)時,非常方便地從0數到列表的長度。”
let names = ["Alex","Anni","Jack"]
let count = names.count
for i in 0..<count {
    print("第\(i+1)個人叫\(names[i])")
}

//10. 邏輯運算符
// 邏輯運算符的操作對象是邏輯布爾值

// 邏輯非 (!a)
// 邏輯與 (a && b)
// 邏輯或 (a || b)”

//邏輯非需要前置且不加空格,讀非a

//“邏輯與運算符(a && b)表達了只有 a 和 b 的值都為 true 時,整個表達式的值才會是 true。”
//“只要任意一個值為 false,整個表達式的值就為 false。事實上,如果第一個值為 false,那么是不去計算第二個值的,因為它已經不可能影響整個表達式的結果了。這被稱做短路計算(short-circuit evaluation)”

//“邏輯或運算符(a || b)是一個由兩個連續的 | 組成的中置運算符。它表示了兩個邏輯表達式的其中一個為 true,整個表達式就為 true。
//同邏輯與運算符類似,邏輯或也是「短路計算」的,當左端的表達式為 true 時,將不計算右邊的表達式了,因為它不可能改變整個表達式的值了”

let enteredDoorCode = true
let passedTetainScan = false
let hasDoorKey = false
let knowOverridePassword = true

if enteredDoorCode && passedTetainScan || hasDoorKey || knowOverridePassword {
    print("welcome")
}else{
print("Access Denied")
}
//注意:“ Swift 邏輯操作符 && 和 || 是左結合的,這意味著擁有多元邏輯操作符的復合表達式優先計算最左邊的子表達式。”
// 使用括號來明確優先級
if (enteredDoorCode && passedTetainScan) || hasDoorKey || knowOverridePassword {
    print("welcome")
}else{
    print("Access Denied")
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容