Swift編程語言中文教程(二):運算符
1、基本運算符
運算符是一種特定的符號或表達式,用來檢驗、修改或合并變量。例如,用求和運算符+可以對兩個數字進行求和(如let i = 1 + 2);稍微復雜一點的例子有邏輯與操作符&& (如if enteredDoorCode && passedRetinaScan) ,自增長運算符 ++i (這是i=i+1的簡寫方式)
Swift支持C標準庫中的大多數運算符并提升了各自的兼容性,從而可以排除常見的編碼錯誤!分配符 (=)不會返回一個值,這樣可以防止你因粗心將賦值運算符 (=)寫成 (==)而引起的錯誤!算術符(+、 -、 *、 /、 % 等)會檢查與駁回值溢出,這樣可以避免值類型的數據在超過值類型所允許的存儲范圍時,出現意想不到的數據。你可以選擇使用Swift所提供的值溢出運算符進行量化溢出的行為,詳細見溢出操作符。
與C語言不同,Swift允許你對浮點數執行取余運算。同時,Swift提供兩個范圍的運算符 (a..b 和 a…b),作為表示一個數值范圍的簡寫方式,這點C不支持。
本章節描述了Swift常見運算符。高級運算符覆蓋了Swift的高級操作符,并且對自定義操作符,對自定義類型操作符的實現進行了描述。
術語
操作符都是一無、二元或三元:
· 一元操作符操作單個對象 (如 -a)。一元前綴操作符出現在對象前(如 !b),一元后綴操作符在對象后出現 (如 i++)。
· 二元操作符操作兩個對象(如 2 + 3),并且操作符位于兩個元素中間。
· 三元操作符對兩個對象進行操作。與C一樣,Swift僅支持一個三元操作符:三元條件操作符 (a ? b : c).
操作符所影響的值被稱為操作數。表達式1 + 2中,符號 + 是一個二元運算符并且兩個操作數分別為 1 和 2。
2、賦值運算符
賦值運算符(a = b) 用b的值去初始化或更新a 的值
let b = 10 var a = 5 a = b // 此刻a的值為10 |
假如右邊賦值的數據為多個數據的數組,它的元素可以是一次性定義的多個常量或變量
let (x, y) = (1, 2) // x等于1, 并且y等于2 |
與C及Objective-C不同,Swift中賦值運算符并不將自身作為一個值進行返回。所以以下的代碼是不合法的:
if x = y { // 錯誤, 因為x = y并不會返回一個值 } |
此特性幫助你避免因粗心將賦值運算符 (=)寫成 (==)而引起的錯誤。因為 if x = y 這樣寫是無效的。
3、數學運算符
Swift支持所有數字類型的四個標注運算符:
· 加法(+)
· 減法(-)
· 乘法(*)
· 除法(/)
例如:
1 + 2 // equals 3 5 - 3 // equals 2 2 * 3 // equals 6 10.0 / 2.5 // equals 4.0 |
不同于C和Objective-C,默認情況下Swift的算術運算符不允許值溢出。你可以通過Swift的溢出運算符來選擇值的溢出情況(例如 a & + b)。詳見
加法運算符對字符串也一樣適用,例如:
"hello, " + "world" // equals "hello, world" |
兩個字符,或者一個字符一個字符串,能組合成一個新的字符串:
let dog: Character = "dog"(由于瀏覽器不能顯示狗的unicode圖像,故用三個字母代替……) let cow: Character = "cow"(同上……) let dogCow = dog + cow // dogCow is equal to "dogcow" |
詳見
余數運算符
余數運算符(a % b)a是b的幾倍并且返回被留下的值(叫作余數)。
余數運算符(%)亦稱是其他語言的一個模數運算符。然而,其在Swift里意味著它是負數,嚴格上講,是余數而不是模數運算。
這是余數運算符如何工作。 要計算9% 4,你首先得求出9是4的幾倍 :
9能去除兩個4,并且余數是1 (顯示在橙色)。
在Swift中,這個將被寫成:
9 % 4 // equals
確定a % b的答案, 運算符%計算下列等式并且返回余數作為其輸出:
a = (b × some multiplier) + remainder
some multiplier 是a里面能包含b的最多倍數。
將9和4插入到公式:
9 = (4 × 2) + 1
同一個方法是應用的,當計算a時的一個負值的余數:
· -9 % 4 // equals -1
將-9和4插入到公式:
-9 = (4 × -2) + -1
產生余數值為-1。
b為負值時的b的符號被忽略,這意味著%b和%-b的結果是一樣的。、
浮點余數計算
不同于C和Objective-C,Swift的余數運算符也能運用于浮點數:
· 8 % 2.5 // equals 0.5
在本例中, 8用2.5來分等于3, 余數是0.5,因此余數為0.5。
增量和減量運算符
(自增和自減運算符)
像C一樣,Swift提供一個增量運算符(++)和減量運算符(–)作為增加或減少一個數字變量的值的快捷方式,數值為1。 您能使用有任何整數或浮點類型的變量使用這些運算符。
var i = 0 ++i // i now equals 1 |
每當你使用 ++i ,i 的值增加1,本質上++i可以看做是i=i+1,同樣–i可以看做是i=i-1。
++和–符號可以使用作為前綴算符或作為后綴運算符。++i 和 i++ 是兩個有效的方式給i的值增加1,同樣,–i和i—如是。
注意這些運算符修改i并且返回值。如果你只想要增加或減值i,您能忽略返回值。然而,如果你使用返回值,根據下列規則將是不同的根據的您是否使用了運算符的前綴或后綴版本,它:
· 如果運算符在變量之前被寫,它在返回其值之前增加變量。
· 如果運算符在變量之后被寫,它在返回其值之后增加變量。
例如:
var a = 0 let b = ++a // a and b are now both equal to 1 let c = a++ // a is now equal to 2, but c has been set to the pre-increment value of 1 |
在上面的例子中,let b = ++a a在返回其值之前增加,這就是為什么a和b的新值是等于1。
然而,let c = a++ a在返回其值之后增加,這意味著c獲得a的原值1,然后a自增,a等于2。
除非你需要特定工作情況下,使用i++,在所有的情況下建議你使用++i和–,因為他們有修改i和返回結果典型的期望的工作情況。
一元減運算符
一個數值前加了符號-,叫作一元減運算符:
let three = 3 let minusThree = -three // minusThree equals -3 let plusThree = -minusThree // plusThree equals 3, or "minus minus three" |
一元減運算符(-)直接地被加在前面,在它起作用的值之前,不用任何空白空間。
一元加運算符
一元加運算符(+)返回它起作用的值,不做任何變動:
let minusSix = -6 let alsoMinusSix = +minusSix // alsoMinusSix equals -6 |
雖然一元加上運算符實際上不執行什么,當你也使用一元減負數的運算符時,你能使用它提供對稱的正數。
4、復合賦值操作符
比較C,Swift提供復合賦值操作符把(=)賦值另一個運算。舉個例子像加法賦值運算符(+ =):
var a = 1 a += 2 // a is now equal to 3 The expression a += 2 is shorthand for a = a + 2. |
能夠有效地加法和賦值組合到一個運算,同時執行這兩個任務。
要注意的是,復合賦值操作符不返回值。例如,你不能寫讓成let b = + = 2,這種行為不同于上面提到的遞增和遞減運算符。
復合賦值運算符的完整列表可以在Expressions那一章節找到
5、比較運算符
Swift支持所有標準c的比較運算符
等于 (a == b)
不等于(a != b)
大于 (a > b)
小于 (a < b)
大于等于 (a >= b)
小于等于(a <= b)
備注
Swift 提供兩個恒等運算符(=== and !==),用它來測試兩個對象引用是否來自于同一個對象實例。看分類和結構獲得更詳細的信息。
每個比較操作符返回一個Bool值來表示語句是否為真:
1 == 1 // true, because 1 is equal to 1 2 != 1 // true, because 2 is not equal to 1 2 > 1 // true, because 2 is greater than 1 1 < 2 // true, because 1 is less than 2 1 >= 1 // true, because 1 is greater than or equal to 1 2 <= 1 // false, because 2 is not less than or equal to 1 |
比較操作符通常用在條件語句,如if語句:
let name = "world" if name == "world" { println("hello, world") } else { println("I'm sorry \(name), but I don't recognize you") } // prints "hello, world", because name is indeed equal to "world" |
想要了解更多有關的if語句,請參閱控制流。
6、三元條件運算符
三元條件運算符是一種特殊的運算符 有三個部分,其形式為question? answer1:answer2.這是一個快捷方式用來評估兩種表達式基于問題是真或是
假。如果question? 為真時,它評估answer1并返回其值;否則,它評估answer2并返回其值。三元條件運算符是下面的代碼的簡化:
if question { answer1 } else { answer2 } |
這里舉一個列子,計算一個表行像素的高度,行高應該是50像素,比內容要高度要高,如果行有一個頭,是20像素。如果行沒有頭:
let contentHeight = 40 let hasHeader = true let rowHeight = contentHeight + (hasHeader ? 50 : 20) // rowHeight is equal to 90 |
前面的例子可以用下面的的代碼:
let contentHeight = 40 let hasHeader = true var rowHeight = contentHeight if hasHeader { rowHeight = rowHeight + 50 } else { rowHeight = rowHeight + 20 } // rowHeight is equal to 90 |
第一個例子使用的三元條件運算符,意味著rowHeight可以設置為正確的值在一行代碼。這比第二個示例更簡潔,消除了需要for rowHeight一個變量,因為它的價值不需要修改在一個if語句。三元條件運算符提供了一個高效的寫法,決定哪些需要考慮兩個表達式。不過還是請小心使用三元條件運算符,其簡潔性如果過度使用會導致閱讀代碼更難。要避免多個實例的三元條件運算符組合成一個復合語句。
7、范圍運算符
Swift包含兩個范圍運算符,能快捷的表達一系列的值
封閉范圍運算符
封閉范圍運算符(a…b)定義了一個范圍,從a到b,并包括a和b的值。
循環訪問時,要在其中使用所有的值的范圍,范圍運算符是一個非常有用的
for-in循環
for index in 1...5 { println("\(index) times 5 is \(index * 5)") } // 1 times 5 is 5 // 2 times 5 is 10 // 3 times 5 is 15 // 4 times 5 is 20 // 5 times 5 is 25 |
欲了解更多for-in循環,請參閱控制流。
半封閉的區域運算符
半封閉的區域運算符(a..b)定義了從a到b的范圍,但不包括b。它被認為是半封閉的,因為它包含第一個值,而不包含最終值。半封閉的范圍使用明確,當你使用從零開始的列表,如數組,它是有用的數到(但不包括)列表的長度:
let names = ["Anna", "Alex", "Brian", "Jack"] let count = names.count for i in 0..count { println("Person \(i + 1) is called \(names[i])") } // Person 1 is called Anna // Person 2 is called Alex // Person 3 is called Brian // Person 4 is called Jack |
請注意,該數組包含四個項目,但0 . .數只數到3(數組中的最后一個項目的索引),因為它是一個半封閉的范圍。欲了解更多有關陣列,請參閱陣列
8、邏輯運算符
邏輯運算符修改或結合布爾邏輯值true和false。Swift支持這三個標準邏輯運算符基于c語言:
Logical NOT (!a)
Logical AND (a && b)
Logical OR (a || b)
邏輯非運算符
邏輯非運算符(!a)轉化一個Bollean值,以便true成為false,false變成true
邏輯操作符是一個前綴操作符,并立即出現在它運行的價值之前,沒有任何空白,它被解讀為”不是”,見下面的例子:
let allowedEntry = false if !allowedEntry { println("ACCESS DENIED") } // prints "ACCESS DENIED" |
這句話if !allowedEntry 能理解為 “if not allowed entry.” 只執行后續的行,如果“not allowed entry” 是 true; 那就是說 if allowedEntry
是false.
在這個例子中,精心挑選的布爾常量和變量名可以幫助保持代碼的可讀性和簡潔,同時避免雙重否定或混亂的邏輯語句。
邏輯與運算符
創建邏輯與運算符:(A && B),其中A和B兩個值必須同時為true時表達式才正確。
其中A或者B有任一值是false時,邏輯與算符表示不成立、失敗。必須兩者同時為true、事實上,如果第一個值是false,第二個值甚至不會再進行判斷,因為必須是兩個值皆為true、已經有一方false、則沒必要再往下面進行判斷了。
以下這個例子判斷兩個Bool 類型的值,并只允許訪問,如果這兩個值都為真的時候會輸出:Welcome。失敗則相反:
let enteredDoorCode = true let passedRetinaScan = false if enteredDoorCode && passedRetinaScan { println("Welcome!") } else { println("ACCESS DENIED") } // prints "ACCESS DENIED” |
邏輯或運算符
表達式(a || b)運算符中、只要a或者b有一個為true、則表達式正確。
與上面的邏輯與運算符相比,前者需要兩個都為true、而后者則只需要其中有一方為true達到標準則判斷表達式為正確。
在下面的例子中,第一個布爾值(hasDoorKey)為false,但第二個值(knowsOverridePassword)為true。因為兩者有一個值是true,整個表達式的計算結果也為true,正確輸出:Welcome!
let hasDoorKey = false let knowsOverridePassword = true if hasDoorKey || knowsOverridePassword { println("Welcome!") } else { println("ACCESS DENIED") } // prints "Welcome!" |
復合邏輯表達式
你可以將多個邏輯運算符復合來創建更長的復合表達式:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { println("Welcome!") } else { println("ACCESS DENIED") } // prints "Welcome!" |
相比于之前兩個單獨分開的運算符。本次運算符多重嵌套、將我們上面&&、|| 兩者運算符相結合組合成一個較長的復合表達式。看起來有點饒人、其實本質還是兩兩相比較、可以簡單地看成A && B || C || D、從左往右根據運算符優先級進行判斷、注意區分開&&、||、只要牢記運算邏輯&&需要兩者都為true、||則只需要一方為true則運算符正確即可解析整個復合表達式、透過現象看本質。
明確地括號(翻譯成中文語句不連貫太特么饒人了、怒了自己寫理解。)
復合表達式中,我們可以添加進()、更加明確邏輯意圖:
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword { println("Welcome!") } else { println("ACCESS DENIED") } // prints "Welcome!" |
在復合邏輯表達式中、我們可以使用括號明確地表示我們需要將幾個值放在一個單獨的邏輯運算中去判斷得出結果、最后根據()內的結果再去與后面的值進行判斷、看上面的例子、就像我們小學學加減乘除一樣、如果沒有括號()我們肯定是按照運算符的優先級去判斷、但此時有了括號、我們需要先運算其中的邏輯運算符得到它們的值.使用括號()在符合邏輯表達式中可以更明確的你的意圖。
本文資源來自互聯網,由本網整理編輯,供大家學習參考。因為技術有限,可能會有不足及錯誤,請大家指正。