標籤:表達 方法 初始化 第一個 複合 var 組成 三元運算子 注意
// 運算子是檢查,改變,合并值的特殊符號或短語,
// swift 支援大部分標準的 C語言的運算子, 且改進許多特性來減少常規編碼錯誤.
/*
如: 賦值符 (=) 不傳回值, 以防止把想要判斷相等運算子 (==) 的地方寫成 賦值符 導致的錯誤. 算數運算子 (+, -, * , / , %) 等 都會檢測並不允許值溢出, 以此來避免儲存變數是由於變數變大或小於其類型所能承載的範圍導致的異常結果, 當然允許你使用 swift 的溢出運算子來實現溢出.
swift 還提供 C語言沒有的表達兩數之間的值的區間運算子 (a..<b 和 a...b), 這方便我們表達一個區間內的數值
*/
// 術語
/*
運算子分為, 一元. 二元 和 三元 運算子:
1. 一元運算子對單一操作對象操作 (如 -a). 一元運算子分前置運算子和後置運算子, 前置運算子需要緊跟在操作對象之前 (如 !b) , 後置運算子需要緊跟操作對象之後 (如: c!)
2. 二元運算子操作兩個操作對象 (如: 2 + 3), 是中置的, 因為他們出現在兩個操作對象之間
3. 三元運算子操作三個操作對象 和 C語言一樣, swift 只有一個三元運算子,就是三目運算子 (a ? b : c)
*/
// 賦值運算子 (a = b), 表示用 b 的值來初始化或更新 a 的值
// 如果賦值的右邊是一個多元組, 他的與元素可以馬上被你分解為多個常量或者變數
// 與C語言 和 OC 不同, swift 的賦值操作並返回任何值, 所以一下代碼是錯誤的
/*
if x = y {
// 此句錯誤,因為 x = y 並不返回任何值
}
這個特性使你無法把 (==) 寫成 (=) .swift 會幫你鼻片此類錯誤
*/
// 算數運算子
// swift 中的所有數值都支援基本的四則算數運算子
// 與C語言和 OC 語言不同的是 ,swift 預設情況下不允許在數值運算中出現一處的情況. 但是你可以使用swift 的溢出運算子來實現溢出運算 (如 : a &+ b)
// 加法的運算子也可以用於 String 的拼接 如: "Hello" + "World"
// 求餘運算子
// 求餘運算子 (a % b) 是計算 b 的多少倍剛剛好可以容入 a , 返回多出來的部分 餘數)
// 注意:
// 求餘運算子 (%) 在其他語言也叫做 ‘模數運算子‘ , 然而嚴格的來說, 我們看改運算子對負數的操作結果, [求餘]更好
// 在對負數 b 求餘時候, b 的符號會被忽略, 這意味著 a % b 和 a % -b 的結果是相同的
// 一元負號運算子 (-) 寫在運算元之前, 中間沒有空格
// 組合賦值運算子
// 組合運算子同C語言的組合運算子一樣 ,但是沒有傳回值 let b = a += 2 這樣寫是錯誤的
// 比較子
// 所有標準的C語言的比較子都可以在 swift 中使用
/*
等於 (a == b)
不等於 (a != b)
大於 (a > b)
小於 (a < b)
大於等於 (a >= b)
小於等於 (a <= b)
注意:
swift 也提供恒等於(===) 和 不恒等於 (!==) 這兩個比較來判斷兩個對象是否引用於同一個對象執行個體
每個比較子都返回另一個標識運算式是否成立的布爾值
1 == 1 // true, 因為 1 等於 1
2 != 1 // true, 因為 2 不等於 1
2 > 1 // true, 因為 2 大於 1
1 < 2 // true, 因為 1 小於2
1 >= 1 // true, 因為 1 大於等於 1
2 <= 1 // false, 因為 2 並不小於等於 1
比較子多用於條件陳述式
*/
// 當元組中的值可以比較時, 你也可以使用這些運算子來比較他們的大小, 例如, 因為 Int 和 String 類型的值可以比較, 所以類型為 (Int, String) 的元組也可以比較大小, 相反 , Bool 不能比較, 也意味著存在有 Bool 的元組不能比較
// 比較元組的大小按照從左至右, 逐值比較的方式,直到發現兩個值不等時候停止, 如果所有的值都相等那麼這一對元組我們認為他們是相等的
// 注意:
// swift 標準庫只能比較七個以內元素的元組比較函數, 如果你的元組元素超過了七個元素個數,需要自己實現比較子
// 三目運算子
/*
三目運算子的特殊在於它是有三個運算元的運算子, 他的形式是 問題? 答案1 : 答案2 . 他簡潔地表達根據問題 成立於否做出二選一的操作 , 如果問題 成立, 返回答案1 , 反之 返回 答案2 的結果
*/
// 空合運算子
// 空合運算子 (a ?? b) 將對可選類型 a 進行是否為空白判斷, 如果 a 包含一個值就進行解鎖, 否則就返回一個預設的值 b , 運算式 a 必須是可選類型(optional), 預設值 b 必須要和 a 儲存值的類型保持一致
// 空合運算子是對一下代碼的簡短表達方法
// a != nil ? a! : b
// 上述代碼使用了三目運算子. 當可選類型 a 的值不為空白時, 進行強制解鎖 (a!) , 訪問 a 的值, 反之返回預設值 b 的值, 無疑空合運算子提供了一種更為優雅的方式去封裝條件判斷和解鎖兩種行為, 顯得簡潔以及更具有可讀性
// 注意:
// 如果 a 為非空值 (non-nil) ,那麼 b 將不會被計算, 這就是所謂的短路求值
// 例如
let defaultColorName = "red"
var userDefinedColorName: String? //預設值為 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值為空白,所以 colorNameToUse 的值為 "red"
// 另一種情況,分配一個非空值(non-nil)給 userDefinedColorName,再次執行空合運算,運算結果為封包在 userDefinedColorName 中的值,而非預設值。
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 非空,因此 colorNameToUse 的值為 "green"
// 區間運算子 (Range Operators)
// Swift 提供了兩個方便表達一個區間的值的區間運算子
// 閉區間運算子
// 閉區間運算子 (a...b) 定義一個包含從 a 到 b (包括 a 和 b )的所有值的區間, a 的值不能超過 b
// 半開區間運算子
// 半開區間運算子 (a..<b)定義一個 從 a 到 b 但不包括 b 的區間
// 之所以稱為半開區間 , 是因為該區間包含第一個值而不包含最後的值
// 半開區間的實用性在於當你使用一個從 0 開始的列表(如數組時0), 非常方便的從0到列表長度
// 邏輯與運算子
// 邏輯運算子 (a && b) 表達只有 a 和 b 的值都為 true 時, z整個運算式的值才會是 true, 只要任意一個值為 false ,整個運算式的值就為 false, 事實上, 如果第一個值是 false ,那麼就不需要計算第二個值的, 因為他已經不可能影響整個運算式的結果了, 這被稱為短路計算
// 邏輯或運算子
// 邏輯或運算子(a || b)是一個由兩個連續的 | 組成的中置運算子。它表示了兩個邏輯運算式的其中一個為 true,整個運算式就為 true。
// 同邏輯與運算子類似,邏輯或也是「短路計算」的,當左端的運算式為 true 時,將不計算右邊的運算式了,因為它不可能改變整個運算式的值了。
// 邏輯運算子組合計算
// 注意:
// Swift 邏輯操作符 && 和 || 是左結合的,這意味著擁有多元邏輯操作符的複合運算式優先計算最左邊的子運算式。
// 使用括弧來明確優先順序
// 為了一個複雜的運算式更容易懂, 在適合的地方使用括弧來明確優先順序是很有效, 雖然他並非是必要的,
Swift 學習- 03 -- 基本運算子