日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift傻傻分不清楚系列(四)基本运算符 o_O!???

發(fā)布時(shí)間:2023/12/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift傻傻分不清楚系列(四)基本运算符 o_O!??? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本頁包含內(nèi)容:

  • 術(shù)語
  • 賦值運(yùn)算符
  • 算術(shù)運(yùn)算符
  • 組合賦值運(yùn)算符
  • 比較運(yùn)算符
  • 三目運(yùn)算符
  • 空合運(yùn)算符
  • 區(qū)間運(yùn)算符
  • 邏輯運(yùn)算符

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

Swift 支持大部分標(biāo)準(zhǔn) C 語言的運(yùn)算符,且改進(jìn)許多特性來減少常規(guī)編碼錯(cuò)誤。如:賦值符(=)不返回值,以防止把想要判斷相等運(yùn)算符(==)的地方寫成賦值符導(dǎo)致的錯(cuò)誤。算術(shù)運(yùn)算符(+,-,*,/,%等)會檢測并不允許值溢出,以此來避免保存變量時(shí)由于變量大于或小于其類型所能承載的范圍時(shí)導(dǎo)致的異常結(jié)果。當(dāng)然允許你使用 Swift 的溢出運(yùn)算符來實(shí)現(xiàn)溢出。

區(qū)別于 C 語言,在 Swift 中你可以對浮點(diǎn)數(shù)進(jìn)行取余運(yùn)算(%),Swift 還提供了 C 語言沒有的表達(dá)兩數(shù)之間的值的區(qū)間運(yùn)算符(a..<b?和?a...b),這方便我們表達(dá)一個(gè)區(qū)間內(nèi)的數(shù)值。

本章節(jié)只描述了 Swift 中的基本運(yùn)算符,高級運(yùn)算符這章會包含 Swift 中的高級運(yùn)算符,及如何自定義運(yùn)算符,及如何進(jìn)行自定義類型的運(yùn)算符重載。

術(shù)語

運(yùn)算符分為一元、二元和三元運(yùn)算符。

  • 一元運(yùn)算符對單一操作對象操作(如?-a)。一元運(yùn)算符分前置運(yùn)算符和后置運(yùn)算符,前置運(yùn)算符需緊跟在操作對象之前(如?!b),后置運(yùn)算符需緊跟在操作對象之后(如?c!)。
  • 二元運(yùn)算符操作兩個(gè)操作對象(如?2 + 3),是中置的,因?yàn)樗鼈兂霈F(xiàn)在兩個(gè)操作對象之間。
  • 三元運(yùn)算符操作三個(gè)操作對象,和 C 語言一樣,Swift 只有一個(gè)三元運(yùn)算符,就是三目運(yùn)算符(a ? b : c)。

受運(yùn)算符影響的值叫操作數(shù),在表達(dá)式?1 + 2?中,加號?+?是二元運(yùn)算符,它的兩個(gè)操作數(shù)是值?1?和?2。

賦值運(yùn)算符

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

let b = 10 var a = 5 a = b // a 現(xiàn)在等于 10

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

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

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

if x = y {// 此句錯(cuò)誤, 因?yàn)?x = y 并不返回任何值 }

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

算術(shù)運(yùn)算符

Swift 中所有數(shù)值類型都支持了基本的四則算術(shù)運(yùn)算:

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

與 C 語言和 Objective-C 不同的是,Swift 默認(rèn)情況下不允許在數(shù)值運(yùn)算中出現(xiàn)溢出情況。但是你可以使用 Swift 的溢出運(yùn)算符來實(shí)現(xiàn)溢出運(yùn)算(如?a &+ b)。

加法運(yùn)算符也可用于?String?的拼接:

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

求余運(yùn)算符

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

注意:
求余運(yùn)算(%)在其他語言也叫取模運(yùn)算。然而嚴(yán)格說來,我們看該運(yùn)算符對負(fù)數(shù)的操作結(jié)果,「求余」比「取模」更合適些。

我們來談?wù)勅∮嗍窃趺椿厥?#xff0c;計(jì)算?9 % 4,你先計(jì)算出?4?的多少倍會剛好可以容入?9?中:

你可以在?9?中放入兩個(gè)?4,那余數(shù)是 1(用橙色標(biāo)出)。

在 Swift 中可以表達(dá)為:

9 % 4 // 等于 1

為了得到?a % b?的結(jié)果,%?計(jì)算了以下等式,并輸出余數(shù)作為結(jié)果:

a = (b × 倍數(shù)) + 余數(shù)

當(dāng)倍數(shù)取最大值的時(shí)候,就會剛好可以容入?a?中。

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

9 = (4 × 2) + 1

同樣的方法,我們來計(jì)算?-9 % 4:

-9 % 4 // 等于 -1

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

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

余數(shù)是?-1。

在對負(fù)數(shù)?b?求余時(shí),b?的符號會被忽略。這意味著?a % b?和?a % -b?的結(jié)果是相同的。

浮點(diǎn)數(shù)求余計(jì)算

不同于 C 語言和 Objective-C,Swift 中是可以對浮點(diǎn)數(shù)進(jìn)行求余的。

8 % 2.5 // 等于 0.5

這個(gè)例子中,8?除以?2.5?等于?3?余?0.5,所以結(jié)果是一個(gè)?Double?型的值為?0.5。

一元負(fù)號運(yùn)算符

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

let three = 3 let minusThree = -three // minusThree 等于 -3 let plusThree = -minusThree // plusThree 等于 3, 或 "負(fù)負(fù)3"

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

一元正號運(yùn)算符

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

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

雖然一元?+?什么都不會改變,但當(dāng)你在使用一元負(fù)號來表達(dá)負(fù)數(shù)時(shí),你可以使用一元正號來表達(dá)正數(shù),如此你的代碼會具有對稱美。

組合賦值運(yùn)算符

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

var a = 1 a += 2 // a 現(xiàn)在是 3

表達(dá)式?a += 2?是?a = a + 2?的簡寫,一個(gè)組合加運(yùn)算就是把加法運(yùn)算和賦值運(yùn)算組合成進(jìn)一個(gè)運(yùn)算符里,同時(shí)完成兩個(gè)運(yùn)算任務(wù)。

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


比較運(yùn)算符(Comparison Operators)

所有標(biāo)準(zhǔn) C 語言中的比較運(yùn)算都可以在 Swift 中使用:

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

注意: Swift 也提供恒等(===)和不恒等(!==)這兩個(gè)比較符來判斷兩個(gè)對象是否引用同一個(gè)對象實(shí)例。

每個(gè)比較運(yùn)算都返回了一個(gè)標(biāo)識表達(dá)式是否成立的布爾值:

1 == 1 // true, 因?yàn)?1 等于 1 2 != 1 // true, 因?yàn)?2 不等于 1 2 > 1 // true, 因?yàn)?2 大于 1 1 < 2 // true, 因?yàn)?1 小于2 1 >= 1 // true, 因?yàn)?1 大于等于 1 2 <= 1 // false, 因?yàn)?2 并不小于等于 1

比較運(yùn)算多用于條件語句,如if條件:

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

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

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

(1, "zebra") < (2, "apple") // true,因?yàn)?1 小于 2 (3, "apple") < (3, "bird") // true,因?yàn)?3 等于 3,但是 apple 小于 bird (4, "dog") == (4, "dog") // true,因?yàn)?4 等于 4,dog 等于 dog

注意: Swift 標(biāo)準(zhǔn)庫只能比較七個(gè)以內(nèi)元素的元組比較函數(shù)。如果你的元組元素超過七個(gè)時(shí),你需要自己實(shí)現(xiàn)比較運(yùn)算符。

三目運(yùn)算符(Ternary Conditional Operator)

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

三目運(yùn)算符是以下代碼的縮寫形式:

if question {answer1 } else {answer2 }

這里有個(gè)計(jì)算表格行高的例子。如果有表頭,那行高應(yīng)比內(nèi)容高度要高出 50 點(diǎn);如果沒有表頭,只需高出 20 點(diǎn):

let contentHeight = 40 let hasHeader = true let rowHeight = contentHeight + (hasHeader ? 50 : 20) // rowHeight 現(xiàn)在是 90

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

let contentHeight = 40 let hasHeader = true var rowHeight = contentHeight if hasHeader {rowHeight = rowHeight + 50 } else {rowHeight = rowHeight + 20 } // rowHeight 現(xiàn)在是 90

第一段代碼例子使用了三目運(yùn)算,所以一行代碼就能讓我們得到正確答案。這比第二段代碼簡潔得多,無需將rowHeight?定義成變量,因?yàn)樗闹禑o需在?if?語句中改變。

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

空合運(yùn)算符(Nil Coalescing Operator)

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

空合運(yùn)算符是對以下代碼的簡短表達(dá)方法:

a != nil ? a! : b

上述代碼使用了三目運(yùn)算符。當(dāng)可選類型?a?的值不為空時(shí),進(jìn)行強(qiáng)制解封(a!),訪問?a?中的值;反之返回默認(rèn)值b。無疑空合運(yùn)算符(??)提供了一種更為優(yōu)雅的方式去封裝條件判斷和解封兩種行為,顯得簡潔以及更具可讀性。

注意: 如果?a?為非空值(non-nil),那么值?b?將不會被計(jì)算。這也就是所謂的短路求值。

下文例子采用空合運(yùn)算符,實(shí)現(xiàn)了在默認(rèn)顏色名和可選自定義顏色名之間抉擇:

let defaultColorName = "red" var userDefinedColorName: String? //默認(rèn)值為 nilvar colorNameToUse = userDefinedColorName ?? defaultColorName // userDefinedColorName 的值為空,所以 colorNameToUse 的值為 "red"

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

另一種情況,分配一個(gè)非空值(non-nil)給?userDefinedColorName,再次執(zhí)行空合運(yùn)算,運(yùn)算結(jié)果為封包在userDefaultColorName?中的值,而非默認(rèn)值。

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

區(qū)間運(yùn)算符(Range Operators)

Swift 提供了兩個(gè)方便表達(dá)一個(gè)區(qū)間的值的運(yùn)算符。

閉區(qū)間運(yùn)算符

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

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

半開區(qū)間運(yùn)算符

半開區(qū)間(a..<b)定義一個(gè)從?a?到?b?但不包括?b?的區(qū)間。 之所以稱為半開區(qū)間,是因?yàn)樵搮^(qū)間包含第一個(gè)值而不包括最后的值。

半開區(qū)間的實(shí)用性在于當(dāng)你使用一個(gè)從 0 開始的列表(如數(shù)組)時(shí),非常方便地從0數(shù)到列表的長度。

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

數(shù)組有 4 個(gè)元素,但?0..<count?只數(shù)到3(最后一個(gè)元素的下標(biāo)),因?yàn)樗前腴_區(qū)間。關(guān)于數(shù)組,請查閱數(shù)組。

邏輯運(yùn)算(Logical Operators)

邏輯運(yùn)算的操作對象是邏輯布爾值。Swift 支持基于 C 語言的三個(gè)標(biāo)準(zhǔn)邏輯運(yùn)算。

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

邏輯非

邏輯非運(yùn)算(!a)對一個(gè)布爾值取反,使得?true?變?false,false?變?true。

它是一個(gè)前置運(yùn)算符,需緊跟在操作數(shù)之前,且不加空格。讀作?非 a?,例子如下:

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

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

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

邏輯與

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

只要任意一個(gè)值為?false,整個(gè)表達(dá)式的值就為?false。事實(shí)上,如果第一個(gè)值為?false,那么是不去計(jì)算第二個(gè)值的,因?yàn)樗呀?jīng)不可能影響整個(gè)表達(dá)式的結(jié)果了。這被稱做「短路計(jì)算(short-circuit evaluation)」。

以下例子,只有兩個(gè)?Bool?值都為?true?的時(shí)候才允許進(jìn)入 if:

let enteredDoorCode = true let passedRetinaScan = false if enteredDoorCode && passedRetinaScan {print("Welcome!") } else {print("ACCESS DENIED") } // 輸出 "ACCESS DENIED"

邏輯或

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

同邏輯與運(yùn)算類似,邏輯或也是「短路計(jì)算」的,當(dāng)左端的表達(dá)式為?true?時(shí),將不計(jì)算右邊的表達(dá)式了,因?yàn)樗豢赡芨淖冋麄€(gè)表達(dá)式的值了。

以下示例代碼中,第一個(gè)布爾值(hasDoorKey)為?false,但第二個(gè)值(knowsOverridePassword)為?true,所以整個(gè)表達(dá)是?true,于是允許進(jìn)入:

let hasDoorKey = false let knowsOverridePassword = true if hasDoorKey || knowsOverridePassword {print("Welcome!") } else {print("ACCESS DENIED") } // 輸出 "Welcome!"

邏輯運(yùn)算符組合計(jì)算

我們可以組合多個(gè)邏輯運(yùn)算來表達(dá)一個(gè)復(fù)合邏輯:

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

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

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

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

注意: Swift 邏輯操作符?&&?和?||?是左結(jié)合的,這意味著擁有多元邏輯操作符的復(fù)合表達(dá)式優(yōu)先計(jì)算最左邊的子表達(dá)式。

使用括號來明確優(yōu)先級

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

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

這括號使得前兩個(gè)值被看成整個(gè)邏輯表達(dá)中獨(dú)立的一個(gè)部分。雖然有括號和沒括號的輸出結(jié)果是一樣的,但對于讀代碼的人來說有括號的代碼更清晰。可讀性比簡潔性更重要,請?jiān)诳梢宰屇愦a變清晰的地方加個(gè)括號吧!

總結(jié)

以上是生活随笔為你收集整理的Swift傻傻分不清楚系列(四)基本运算符 o_O!???的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。