亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

2.Swift基本運算符(Basic Operators)

2019-11-09 17:49:40
字體:
來源:轉載
供稿:網友

運算符是檢查、改變、合并值的特殊符號或短語。例如,加號(+)將兩個數相加(如 let i = 1 + 2)。更復雜的運算例子包括邏輯與運算符 &&(如 if enteredDoorCode && passedRetinaScan)。

Swift 支持大部分標準 C 語言的運算符,且改進許多特性來減少常規編碼錯誤。如:賦值符(=)不返回值,以防止把想要判斷相等運算符(==)的地方寫成賦值符導致的錯誤。算術運算符(+-,*,/,%等)會檢測并不允許值溢出,以此來避免保存變量時由于變量大于或小于其類型所能承載的范圍時導致的異常結果。當然允許你使用 Swift 的溢出運算符來實現溢出。詳情參見溢出運算符。

區別于 C 語言,在 Swift 中你可以對浮點數進行取余運算(%),Swift 還提供了 C 語言沒有的表達兩數之間的值的區間運算符(a..<b 和 a...b),這方便我們表達一個區間內的數值。

本章節只描述了 Swift 中的基本運算符,高級運算符這章會包含 Swift 中的高級運算符,及如何自定義運算符,及如何進行自定義類型的運算符重載。

術語

運算符分為一元、二元和三元運算符。

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

受運算符影響的值叫操作數,在表達式 1 + 2 中,加號 + 是二元運算符,它的兩個操作數是值 1 和 2。

賦值運算符

賦值運算(a = b),表示用 b 的值來初始化或更新 a 的值:

let b = 10var a = 5a = b// a 現在等于 10

如果賦值的右邊是一個多元組,它的元素可以馬上被分解成多個常量或變量:

let (x, y) = (1, 2)// 現在 x 等于 1,y 等于 2

與 C 語言和 Objective-C 不同,Swift 的賦值操作并不返回任何值。所以以下代碼是錯誤的:

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

這個特性使你無法把(==)錯寫成(=),由于 if x = y 是錯誤代碼,Swift 能幫你避免此類錯誤發生。

算術運算符

Swift 中所有數值類型都支持了基本的四則算術運算:

加法(+)減法(-)乘法(*)除法(/
1 + 2       // 等于 35 - 3       // 等于 22 * 3       // 等于 610.0 / 2.5  // 等于 4.0

與 C 語言和 Objective-C 不同的是,Swift 默認情況下不允許在數值運算中出現溢出情況。但是你可以使用 Swift 的溢出運算符來實現溢出運算(如 a &+ b)。詳情參見溢出運算符。

加法運算符也可用于 String 的拼接:

"hello, " + "world"  // 等于 "hello, world"

求余運算符

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

注意:求余運算(%)在其他語言也叫取模運算。然而嚴格說來,我們看該運算符對負數的操作結果,「求余」比「取?!垢线m些。

我們來談談取余是怎么回事,計算 9 % 4,你先計算出 4 的多少倍會剛好可以容入 9 中:

Art/remainderInteger_2x.png

你可以在 9 中放入兩個 4,那余數是 1(用橙色標出)。

在 Swift 中可以表達為:

9 % 4    // 等于 1

為了得到 a % b 的結果,% 計算了以下等式,并輸出余數作為結果:

a = (b × 倍數) + 余數

倍數取最大值的時候,就會剛好可以容入 a 中。

把 9 和 4 代入等式中,我們得 1

9 = (4 × 2) + 1

同樣的方法,我們來計算 -9 % 4

-9 % 4   // 等于 -1

把 -9 和 4 代入等式,-2 是取到的最大整數:

-9 = (4 × -2) + -1

余數是 -1

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

浮點數求余計算

不同于 C 語言和 Objective-C,Swift 中是可以對浮點數進行求余的。

8 % 2.5   // 等于 0.5

這個例子中,8 除以 2.5 等于 3 余 0.5,所以結果是一個 Double 型的值為 0.5

Art/remainderFloat_2x.png

一元負號運算符

數值的正負號可以使用前綴 -(即一元負號)來切換:

let three = 3let minusThree = -three       // minusThree 等于 -3let plusThree = -minusThree   // plusThree 等于 3, 或 "負負3"

一元負號(-)寫在操作數之前,中間沒有空格。

一元正號運算符

一元正號(+)不做任何改變地返回操作數的值:

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

雖然一元 + 什么都不會改變,但當你在使用一元負號來表達負數時,你可以使用一元正號來表達正數,如此你的代碼會具有對稱美。

組合賦值運算符

如同 C 語言,Swift 也提供把其他運算符和賦值運算(=)組合的組合賦值運算符,組合加運算(+=)是其中一個例子:

var a = 1a += 2// a 現在是 3

表達式 a += 2 是 a = a + 2 的簡寫,一個組合加運算就是把加法運算和賦值運算組合成進一個運算符里,同時完成兩個運算任務。

注意:復合賦值運算沒有返回值,let b = a += 2這類代碼是錯誤。這不同于上面提到的自增和自減運算符。

在表達式章節里有復合運算符的完整列表。 ?

比較運算符(Comparison Operators)

所有標準 C 語言中的比較運算都可以在 Swift 中使用:

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

注意: Swift 也提供恒等(===)和不恒等(!==)這兩個比較符來判斷兩個對象是否引用同一個對象實例。更多細節在類與結構。

每個比較運算都返回了一個標識表達式是否成立的布爾值:

1 == 1   // true, 因為 1 等于 12 != 1   // true, 因為 2 不等于 12 > 1    // true, 因為 2 大于 11 < 2    // true, 因為 1 小于21 >= 1   // true, 因為 1 大于等于 12 <= 1   // false, 因為 2 并不小于等于 1

比較運算多用于條件語句,如if條件:

let name = "world"if name == "world" {    PRint("hello, world")} else {    print("I'm sorry /(name), but I don't recognize you")}// 輸出 "hello, world", 因為 `name` 就是等于 "world"

關于 if 語句,請看控制流。

當元組中的值可以比較時,你也可以使用這些運算符來比較它們的大小。例如,因為 Int 和 String 類型的值可以比較,所以類型為 (Int, String) 的元組也可以被比較。相反,Bool 不能被比較,也意味著存有布爾類型的元組不能被比較。

比較元組大小會按照從左到右、逐值比較的方式,直到發現有兩個值不等時停止。如果所有的值都相等,那么這一對元組我們就稱它們是相等的。例如:

(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

注意: Swift 標準庫只能比較七個以內元素的元組比較函數。如果你的元組元素超過七個時,你需要自己實現比較運算符。

三目運算符(Ternary Conditional Operator)

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

三目運算符是以下代碼的縮寫形式:

if question {    answer1} else {    answer2}

這里有個計算表格行高的例子。如果有表頭,那行高應比內容高度要高出 50 點;如果沒有表頭,只需高出 20 點:

let contentHeight = 40let hasHeader = truelet rowHeight = contentHeight + (hasHeader ? 50 : 20)// rowHeight 現在是 90

上面的寫法比下面的代碼更簡潔:

let contentHeight = 40let hasHeader = truevar rowHeight = contentHeightif hasHeader {    rowHeight = rowHeight + 50} else {    rowHeight = rowHeight + 20}// rowHeight 現在是 90

第一段代碼例子使用了三目運算,所以一行代碼就能讓我們得到正確答案。這比第二段代碼簡潔得多,無需將 rowHeight 定義成變量,因為它的值無需在 if 語句中改變。

三目運算提供有效率且便捷的方式來表達二選一的選擇。需要注意的事,過度使用三目運算符會使簡潔的代碼變的難懂。我們應避免在一個組合語句中使用多個三目運算符。

空合運算符(Nil Coalescing Operator)

空合運算符(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?   //默認值為 nilvar colorNameToUse = userDefinedColorName ?? defaultColorName// userDefinedColorName 的值為空,所以 colorNameToUse 的值為 "red"

userDefinedColorName 變量被定義為一個可選的 String 類型,默認值為 nil。由于 userDefinedColorName 是一個可選類型,我們可以使用空合運算符去判斷其值。在上一個例子中,通過空合運算符為一個名為 colorNameToUse的變量賦予一個字符串類型初始值。 由于 userDefinedColorName 值為空,因此表達式 userDefinedColorName ?? defaultColorName 返回 defaultColorName 的值,即 red。

另一種情況,分配一個非空值(non-nil)給 userDefinedColorName,再次執行空合運算,運算結果為封包在 userDefaultColorName 中的值,而非默認值。

userDefinedColorName = "green"colorNameToUse = userDefinedColorName ?? defaultColorName// userDefinedColorName 非空,因此 colorNameToUse 的值為 "green"

區間運算符(Range Operators)

Swift 提供了兩個方便表達一個區間的值的運算符。

閉區間運算符

閉區間運算符(a...b)定義一個包含從 a 到 b(包括 a 和 b)的所有值的區間。a 的值不能超過 b。 ? 閉區間運算符在迭代一個區間的所有值時是非常有用的,如在 for-in 循環中:

for index in 1...5 {    print("/(index) * 5 = /(index * 5)")}// 1 * 5 = 5// 2 * 5 = 10// 3 * 5 = 15// 4 * 5 = 20// 5 * 5 = 25

關于 for-in,請看控制流。

半開區間運算符

半開區間(a..<b)定義一個從 a 到 b 但不包括 b 的區間。 之所以稱為半開區間,是因為該區間包含第一個值而不包括最后的值。

半開區間的實用性在于當你使用一個從 0 開始的列表(如數組)時,非常方便地從0數到列表的長度。

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

數組有 4 個元素,但 0..<count 只數到3(最后一個元素的下標),因為它是半開區間。關于數組,請查閱數組。

邏輯運算(Logical Operators)

邏輯運算的操作對象是邏輯布爾值。Swift 支持基于 C 語言的三個標準邏輯運算。

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

邏輯非

邏輯非運算(!a)對一個布爾值取反,使得 true 變 falsefalse 變 true。

它是一個前置運算符,需緊跟在操作數之前,且不加空格。讀作 非 a ,例子如下:

let allowedEntry = falseif !allowedEntry {    print("access DENIED")}// 輸出 "ACCESS DENIED"

if !allowedEntry 語句可以讀作「如果非 allowedEntry」,接下一行代碼只有在「非 allowedEntry」為 true,即 allowEntry 為 false 時被執行。

在示例代碼中,小心地選擇布爾常量或變量有助于代碼的可讀性,并且避免使用雙重邏輯非運算,或混亂的邏輯語句。

邏輯與

邏輯與(a && b)表達了只有 a 和 b 的值都為 true 時,整個表達式的值才會是 true。

只要任意一個值為 false,整個表達式的值就為 false。事實上,如果第一個值為 false,那么是不去計算第二個值的,因為它已經不可能影響整個表達式的結果了。這被稱做「短路計算(short-circuit evaluation)」。

以下例子,只有兩個 Bool 值都為 true 的時候才允許進入 if:

let enteredDoorCode = truelet passedRetinaScan = falseif enteredDoorCode && passedRetinaScan {    print("Welcome!")} else {    print("ACCESS DENIED")}// 輸出 "ACCESS DENIED"

邏輯或

邏輯或(a || b)是一個由兩個連續的 | 組成的中置運算符。它表示了兩個邏輯表達式的其中一個為 true,整個表達式就為 true。

同邏輯與運算類似,邏輯或也是「短路計算」的,當左端的表達式為 true 時,將不計算右邊的表達式了,因為它不可能改變整個表達式的值了。

以下示例代碼中,第一個布爾值(hasDoorKey)為 false,但第二個值(knowsOverridePassWord)為 true,所以整個表達是 true,于是允許進入:

let hasDoorKey = falselet knowsOverridePassword = trueif hasDoorKey || knowsOverridePassword {    print("Welcome!")} else {    print("ACCESS DENIED")}// 輸出 "Welcome!"

邏輯運算符組合計算

我們可以組合多個邏輯運算來表達一個復合邏輯:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {    print("Welcome!")} else {    print("ACCESS DENIED")}// 輸出 "Welcome!"

這個例子使用了含多個 && 和 || 的復合邏輯。但無論怎樣,&& 和 || 始終只能操作兩個值。所以這實際是三個簡單邏輯連續操作的結果。我們來解讀一下:

如果我們輸入了正確的密碼并通過了視網膜掃描,或者我們有一把有效的鑰匙,又或者我們知道緊急情況下重置的密碼,我們就能把門打開進入。

前兩種情況,我們都不滿足,所以前兩個簡單邏輯的結果是 false,但是我們是知道緊急情況下重置的密碼的,所以整個復雜表達式的值還是 true。

注意: Swift 邏輯操作符 && 和 || 是左結合的,這意味著擁有多元邏輯操作符的復合表達式優先計算最左邊的子表達式。

使用括號來明確優先級

為了一個復雜表達式更容易讀懂,在合適的地方使用括號來明確優先級是很有效的,雖然它并非必要的。在上個關于門的權限的例子中,我們給第一個部分加個括號,使它看起來邏輯更明確:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {    print("Welcome!")} else {    print("ACCESS DENIED")}// 輸出 "Welcome!"

這括號使得前兩個值被看成整個邏輯表達中獨立的一個部分。雖然有括號和沒括號的輸出結果是一樣的,但對于讀代碼的人來說有括號的代碼更清晰??勺x性比簡潔性更重要,請在可以讓你代碼變清晰的地方加個括號吧!


上一篇:正則表達式

下一篇:時間日期比較

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影在线看| 久久久电影免费观看完整版| 亚洲欧美中文在线视频| 亚洲精品综合精品自拍| 国产男女猛烈无遮挡91| 亚洲最新av在线| 欧美激情高清视频| 日韩中文字幕免费看| 中文字幕亚洲一区二区三区| 国产精品v片在线观看不卡| 成人情趣片在线观看免费| 国产精品极品在线| 日韩性xxxx爱| 揄拍成人国产精品视频| 日韩www在线| 成人在线免费观看视视频| 亚洲欧美三级伦理| 成人性教育视频在线观看| 国产女精品视频网站免费| 国内精品久久久久久久| 性色av一区二区三区红粉影视| 一色桃子一区二区| 深夜福利日韩在线看| 国产亚洲精品久久久久久牛牛| 久久99精品久久久久久噜噜| 91精品国产99| 中文字幕在线观看亚洲| 国产99久久精品一区二区| 日韩精品高清在线观看| 亚洲国产精品中文| 久热99视频在线观看| 伊人精品在线观看| 亚洲精品国精品久久99热| 国产精品久久久久久久电影| 日产精品久久久一区二区福利| 久久精品美女视频网站| 国产自产女人91一区在线观看| 国产亚洲a∨片在线观看| 欧美性videos高清精品| 日韩高清不卡av| 国产精品麻豆va在线播放| 亚洲人成网站999久久久综合| 欧美整片在线观看| 亚洲免费视频一区二区| 亚洲欧美综合图区| 色噜噜狠狠狠综合曰曰曰| 国产成人综合精品在线| 久久久久久久久久婷婷| 国产亚洲欧洲在线| 欧美在线观看网址综合| 精品久久久国产精品999| 色综合天天综合网国产成人网| 精品夜色国产国偷在线| 亚洲精品ady| 精品久久久免费| 国产精品91免费在线| 国产精品激情av电影在线观看| 欧美亚洲成人精品| 91中文在线观看| 久久久久久久久网站| 992tv在线成人免费观看| 亚洲视频在线观看网站| 成人黄色中文字幕| 欧美主播福利视频| 欧美日韩亚洲91| 国产色视频一区| 欧美福利小视频| 日本亚洲欧洲色α| 97视频com| 日本久久91av| 国产精品嫩草视频| 92看片淫黄大片看国产片| 精品久久久在线观看| 日韩在线精品一区| 色综合老司机第九色激情| 日韩精品在线观| 按摩亚洲人久久| 国产一区二区三区在线视频| 成人免费高清完整版在线观看| 欧美激情精品久久久久久变态| 欧美人在线观看| 国产一区二中文字幕在线看| 国产精品一区二区久久精品| 欧美另类69精品久久久久9999| 日韩av在线天堂网| 亚洲精品国偷自产在线99热| 日本精品一区二区三区在线播放视频| 亚洲精品97久久| 久久99热精品这里久久精品| 日韩在线中文字| 色爱精品视频一区| 热久久这里只有| 亚洲网在线观看| 自拍视频国产精品| 国产91色在线|免| 97超碰蝌蚪网人人做人人爽| 91国产视频在线| 国产成人精品久久二区二区| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲人永久免费| 国产日韩换脸av一区在线观看| 欧美电影在线观看高清| 久久视频免费在线播放| 国产中文日韩欧美| 午夜精品久久久久久久久久久久久| 成人免费在线视频网址| 亚洲精品欧美日韩专区| 一本色道久久综合亚洲精品小说| 久久久国产91| 欧美性受xxxx黑人猛交| 久久精品国产久精国产一老狼| 红桃视频成人在线观看| 国产精品免费久久久久影院| 久久久久久国产精品| 午夜精品久久久久久久99黑人| 九九热99久久久国产盗摄| 亚洲精品中文字幕有码专区| 欧美精品久久久久| 91精品国产自产在线| 日韩精品在线观看网站| 日本国产一区二区三区| 97视频人免费观看| 精品色蜜蜜精品视频在线观看| 欧美一区二区三区……| 精品视频在线播放色网色视频| 91中文精品字幕在线视频| 日韩激情片免费| 精品视频在线播放免| 国产精品一区二区三区久久久| 日韩一区二区三区xxxx| 亚洲经典中文字幕| 色综久久综合桃花网| 欧美在线视频播放| 日本19禁啪啪免费观看www| 日韩免费av一区二区| 精品久久久91| 欧美激情精品久久久| 91久久精品国产91性色| 色妞在线综合亚洲欧美| 欧美色欧美亚洲高清在线视频| 日韩中文字幕在线免费观看| 九九久久久久久久久激情| 亚洲色图美腿丝袜| 亚洲精品国产精品国产自| 国产精品久久久久999| 国产精品福利在线| 国产成人免费91av在线| 国产欧美亚洲视频| 国产一区二区精品丝袜| 欧美一区二区影院| 国产精品爽黄69| 成人激情视频免费在线| 97视频网站入口| 欧美丰满片xxx777| 欧美在线xxx| 欧美午夜精品久久久久久人妖| 中文字幕在线观看日韩| 国产视频精品自拍| 韩剧1988在线观看免费完整版| 国产亚洲精品91在线| 中文字幕亚洲综合| 欧美一区二粉嫩精品国产一线天| 国产免费一区视频观看免费| 日韩h在线观看|