国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Swift > 正文

Swift教程之基本運(yùn)算符詳解

2020-03-09 17:51:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Swift教程之基本運(yùn)算符詳解,本文講解了賦值運(yùn)算符、數(shù)學(xué)運(yùn)算符、取余運(yùn)算符、浮點(diǎn)余數(shù)計(jì)算、自增和自減運(yùn)算符等,需要的朋友可以參考下
 

運(yùn)算符是一種特定的符號(hào)或表達(dá)式,用來(lái)檢驗(yàn)、修改或合并變量。例如,用求和運(yùn)算符+可以對(duì)兩個(gè)數(shù)字進(jìn)行求和(如let i = 1 + 2);稍微復(fù)雜一點(diǎn)的例子有邏輯與操作符&& (如if enteredDoorCode && passedRetinaScan) ,自增長(zhǎng)運(yùn)算符 ++i (這是i=i+1的簡(jiǎn)寫(xiě)方式)

Swift支持C標(biāo)準(zhǔn)庫(kù)中的大多數(shù)運(yùn)算符并提升了各自的兼容性,從而可以排除常見(jiàn)的編碼錯(cuò)誤。賦值操作符 (=)不會(huì)返回一個(gè)值,這樣可以防止你因粗心將賦值運(yùn)算符 (=)寫(xiě)成 (==)而引起錯(cuò)誤。算術(shù)符(+、 -、 *、 /、 % 等)會(huì)檢查與駁回值溢出,這樣可以避免值類(lèi)型的數(shù)據(jù)在超過(guò)值類(lèi)型所允許的存儲(chǔ)范圍時(shí),出現(xiàn)意想不到的數(shù)據(jù)。你可以選擇使用Swift所提供的值溢出運(yùn)算符進(jìn)行量化溢出的行為,詳細(xì)見(jiàn)溢出操作符。 

與C語(yǔ)言不同,Swift允許你對(duì)浮點(diǎn)數(shù)執(zhí)行取余運(yùn)算。同時(shí),Swift提供兩個(gè)范圍的運(yùn)算符 (a..b 和 a…b),作為表示一個(gè)數(shù)值范圍的簡(jiǎn)寫(xiě)方式,這點(diǎn)C不支持。

本章節(jié)描述了Swift常見(jiàn)運(yùn)算符。高級(jí)運(yùn)算符覆蓋了Swift的高級(jí)操作符,并且對(duì)自定義操作符,對(duì)自定義類(lèi)型操作符的實(shí)現(xiàn)進(jìn)行了描述。

術(shù)語(yǔ)

操作符都是一元、二元或三元:

◎一元操作符操作單個(gè)對(duì)象 (如 -a)。一元前綴操作符出現(xiàn)在對(duì)象前(如 !b),一元后綴操作符在對(duì)象后出現(xiàn) (如 i++)。
◎二元操作符操作兩個(gè)對(duì)象(如 2 + 3),并且操作符位于兩個(gè)元素中間。
◎三元操作符對(duì)兩個(gè)對(duì)象進(jìn)行操作。與C一樣,Swift僅支持一個(gè)三元操作符:三元條件操作符 (a ? b : c).

操作符所影響的值被稱(chēng)為操作數(shù)。表達(dá)式1 + 2中,符號(hào) + 是一個(gè)二元運(yùn)算符并且兩個(gè)操作數(shù)分別為 1 和 2。

賦值運(yùn)算符

賦值運(yùn)算符(a = b) 用b的值去初始化或更新a 的值

復(fù)制代碼代碼如下:

let b = 10
var a = 5
a = b
// 此刻a的值為10

假如右邊賦值的數(shù)據(jù)為多個(gè)數(shù)據(jù)的元組,它的元素可以是一次性賦給的多個(gè)常量或變量
復(fù)制代碼代碼如下:

let (x, y) = (1, 2)
// x等于1, 并且y等于2

與C及Objective-C不同,Swift中賦值運(yùn)算符并不將自身作為一個(gè)值進(jìn)行返回。所以以下的代碼是不合法的:
復(fù)制代碼代碼如下:

if x = y {
// 錯(cuò)誤, 因?yàn)閤 = y并不會(huì)返回一個(gè)值
}

此特性幫助你避免因粗心將賦值運(yùn)算符 (==)寫(xiě)成 (=)而引起的錯(cuò)誤。因?yàn)?if x = y 這樣寫(xiě)是無(wú)效的。

 

數(shù)學(xué)運(yùn)算符
Swift支持所有數(shù)字類(lèi)型的四個(gè)標(biāo)注運(yùn)算符:

◎加法(+) *減法(-)
◎乘法(*)
◎除法(/)

例如:

復(fù)制代碼代碼如下:

1 + 2 // equals 3
5 - 3 // equals 2
2 * 3 // equals 6
10.0 / 2.5 // equals 4.0

不同于C和Objective-C,默認(rèn)情況下Swift的算術(shù)運(yùn)算符不允許值溢出。你可以通過(guò)Swift的溢出運(yùn)算符來(lái)選擇值的溢出情況(例如 a & + b)。詳見(jiàn) Overflow Operators

 

加法運(yùn)算符對(duì)字符串連接也一樣適用,例如:

復(fù)制代碼代碼如下:

"hello, " + "world" // equals "hello, world"

兩個(gè)字符,或者一個(gè)字符一個(gè)字符串,能組合成一個(gè)新的字符串:
復(fù)制代碼代碼如下:

let dog: Character = "dog"(由于瀏覽器不能顯示狗的unicode圖像,故用三個(gè)字母代替……)
let cow: Character = "cow"(同上……)
let dogCow = dog + cow
// dogCow is equal to "dogcow"

 

詳見(jiàn)Concatenating Strings and Characters 

取余運(yùn)算符

取余運(yùn)算符(a % b)計(jì)算出a是b的幾倍然后返回被留下的值(余數(shù))。

注:余數(shù)運(yùn)算符(%)亦稱(chēng)是其他語(yǔ)言的一個(gè)取模運(yùn)算符。然而,其在Swift里意味著如果對(duì)負(fù)數(shù)操作,嚴(yán)格上講,得到的是余數(shù)而不是模數(shù)。

這是余數(shù)運(yùn)算符如何工作。 要計(jì)算9% 4,你首先得求出9是4的幾倍 :

Swift教程之基本運(yùn)算符詳解

9能去除兩個(gè)4,并且余數(shù)是1 (顯示在橙色)。

在Swift中,這個(gè)將被寫(xiě)成:

復(fù)制代碼代碼如下:

9 % 4 // equals

確定a % b的答案, 運(yùn)算符%計(jì)算下列等式并且返回余數(shù)作為其輸出:
復(fù)制代碼代碼如下:

a = (b × some multiplier) + remainder

some multiplier 是a里面能包含b的最多倍數(shù)。

 

將9和4插入到公式:

復(fù)制代碼代碼如下:

9 = (4 × 2) + 1

同一個(gè)方法是應(yīng)用的,當(dāng)計(jì)算a時(shí)的一個(gè)負(fù)值的余數(shù):
復(fù)制代碼代碼如下:

 -9 % 4 // equals -1
 

將-9和4插入到公式:
復(fù)制代碼代碼如下:

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

產(chǎn)生余數(shù)值為-1。

 

b為負(fù)值時(shí)的b的符號(hào)被忽略,這意味著%b和%-b的結(jié)果是一樣的。

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

不同于C和Objective-C,Swift的余數(shù)運(yùn)算符也能運(yùn)用于浮點(diǎn)數(shù):

復(fù)制代碼代碼如下:

 8 % 2.5 // equals 0.5

在本例中, 8用2.5來(lái)分等于3, 余數(shù)是0.5,因此余數(shù)為0.5。

 

Swift教程之基本運(yùn)算符詳解

自增和自減運(yùn)算符

像C一樣,Swift提供一個(gè)自增運(yùn)算符(++)和自減運(yùn)算符(–)作為增加或減少一個(gè)數(shù)值的一種快捷方式,增減量為1。 您能對(duì)任何整數(shù)或浮點(diǎn)類(lèi)型的變量使用這些運(yùn)算符。

復(fù)制代碼代碼如下:

var i = 0 
++i // i now equals 1

每當(dāng)你使用 ++i ,i 的值增加1,本質(zhì)上++i可以看做是i=i+1,同樣–i可以看做是i=i-1。

 

++和–符號(hào)可以使用作為前綴算符或作為后綴運(yùn)算符。++i 和 i++ 是兩個(gè)有效的方式給i的值增加1,同樣, –i和i–如是。

注意這些運(yùn)算符修改i并且返回值。如果你只想要增加或減值i,您可以忽略返回值。然而,如果你使用返回值,根據(jù)下列規(guī)則將是不同的根據(jù)的您是否使用了運(yùn)算符的前綴或后綴版本,它:

◎如果運(yùn)算符在變量之前被寫(xiě),它在返回其值之前增加變量。
◎如果運(yùn)算符在變量之后被寫(xiě),它在返回其值之后增加變量。

例如:

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, 因?yàn)樗麄冃薷膇并返回值的行為符合我們的預(yù)期。

一元減運(yùn)算符

一個(gè)數(shù)值前加了符號(hào)-,叫作一元減運(yùn)算符:

復(fù)制代碼代碼如下:

let three = 3
let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus three"

一元減運(yùn)算符(-)直接地被加在前面,在它起作用的值之前,不用任何空白空間。

 

一元加運(yùn)算符

一元加運(yùn)算符(+)返回它起作用的值,不做任何變動(dòng):

復(fù)制代碼代碼如下:

let minusSix = -6
let alsoMinusSix = +minusSix // alsoMinusSix equals -6

雖然一元加上運(yùn)算符實(shí)際上不執(zhí)行什么,當(dāng)你也使用一元減負(fù)數(shù)的運(yùn)算符時(shí),你能使用它提供對(duì)稱(chēng)的正數(shù)。

 

復(fù)合賦值操作符

Swift提供類(lèi)似C語(yǔ)言的復(fù)合賦值操作符,即把賦值和另一個(gè)運(yùn)算合并起來(lái)。舉個(gè)例子,像加法賦值運(yùn)算符(+ =):

復(fù)制代碼代碼如下:

var a = 1
a += 2
// a is now equal to 3

表達(dá)式 a += 2 比 a = a + 2更精煉。加法賦值運(yùn)算符能夠有效地把加法和賦值組合到一個(gè)運(yùn)算,同時(shí)執(zhí)行這兩個(gè)任務(wù)。

 

要注意的是,復(fù)合賦值操作符不返回值。例如,你不能寫(xiě)讓成let b = + = 2,這種行為不同于上面提到的遞增和遞減運(yùn)算符。

復(fù)合賦值運(yùn)算符的完整列表可以在[Expressions]那一章節(jié)找到

比較運(yùn)算符

Swift支持所有標(biāo)準(zhǔn)c的比較運(yùn)算符

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

注:Swift 提供兩個(gè)恒等運(yùn)算符(=== and !==),用它來(lái)測(cè)試兩個(gè)對(duì)象引用是否來(lái)自于同一個(gè)對(duì)象實(shí)例。詳見(jiàn)Classes and Structures。 每個(gè)比較操作符返回一個(gè)Bool值來(lái)表示語(yǔ)句是否為真:

 

復(fù)制代碼代碼如下:

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

 

比較操作符通常用在條件語(yǔ)句,如if語(yǔ)句:

復(fù)制代碼代碼如下:

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"

 

想要了解更多有關(guān)的if語(yǔ)句,請(qǐng)參閱控制流。

三元條件運(yùn)算符
三元條件運(yùn)算符是一種特殊的運(yùn)算符,有三個(gè)部分,其形式為question? answer1:answer2.這是一個(gè)用來(lái)測(cè)試兩種表達(dá)式基于輸入是真或是 假的快捷方式。如果question? 為真時(shí), 它評(píng)估answer1并返回其值; 否則,它評(píng)估answer2并返回其值。三元條件運(yùn)算符是下面的代碼的簡(jiǎn)化:

復(fù)制代碼代碼如下:

if question {
answer1
} else {
answer2
}

這里舉一個(gè)列子,計(jì)算一個(gè)表行像素的高度,如果行有一個(gè)頭,行高應(yīng)該是50像素,比內(nèi)容要高度要高。如果行沒(méi)有頭是20像素:
復(fù)制代碼代碼如下:

let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90

前面的例子也可以用下面的的代碼:
復(fù)制代碼代碼如下:

let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
rowHeight = rowHeight + 50
} else {
rowHeight = rowHeight + 20
}
// rowHeight is equal to 90

第一個(gè)例子使用的三元條件運(yùn)算符,意味著rowHeight可以在一行代碼被設(shè)置為正確的值。這比第二個(gè)示例更簡(jiǎn)潔, 不需要課外的rowHeight變量, 因?yàn)樗膬r(jià)值不需要在一個(gè)if語(yǔ)句中修改。

 

三元條件運(yùn)算符提供了一個(gè)高效的寫(xiě)法來(lái)決定哪個(gè)表達(dá)式會(huì)被執(zhí)行。不過(guò)還是請(qǐng)小心使用三元條件運(yùn)算符,其簡(jiǎn)潔性如果過(guò)度使用會(huì)導(dǎo)致閱讀代碼的困難。要避免多個(gè)實(shí)例的三元條件運(yùn)算符組合成一個(gè)復(fù)合語(yǔ)句。

范圍運(yùn)算符

Swift包含兩個(gè)范圍運(yùn)算符,能快捷的表達(dá)一系列的值

封閉范圍運(yùn)算符

封閉范圍運(yùn)算符(a…b)定義了一個(gè)范圍,從a到b,并包括a和b的值。

當(dāng)要在一個(gè)范圍內(nèi)迭代所有可能的值的時(shí)候,范圍運(yùn)算符是非常有用的, 例如for-in循環(huán)

復(fù)制代碼代碼如下:

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循環(huán),請(qǐng)參閱控制流。 

半封閉的區(qū)域運(yùn)算符

半封閉的區(qū)域運(yùn)算符(a..b)定義了從a到b的范圍,但不包括b。它被認(rèn)為是半封閉的,因?yàn)樗谝粋€(gè)值,而不包含最終值。

半封閉的范圍使用明確,當(dāng)你使用從零開(kāi)始的列表,如數(shù)組,它是有用的數(shù)到(但不包括)列表的長(zhǎng)度:

復(fù)制代碼代碼如下:

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

 

請(qǐng)注意,該數(shù)組包含四個(gè)項(xiàng)目,但0 . .數(shù)只數(shù)到3(數(shù)組中的最后一個(gè)項(xiàng)目的索引),因?yàn)樗且粋€(gè)半封閉的范圍。欲了解更多有關(guān)數(shù)組的信息,請(qǐng)參閱數(shù)組 

邏輯運(yùn)算符

邏輯運(yùn)算符修改或結(jié)合布爾邏輯值true和false。Swift支持這三個(gè)標(biāo)準(zhǔn)邏輯運(yùn)算符基于c語(yǔ)言:

◎Logical NOT (!a)
◎Logical AND (a && b)
◎Logical OR (a || b)

邏輯非運(yùn)算符

邏輯非運(yùn)算符(!a)轉(zhuǎn)化一個(gè)Bollean值,true變成false,false變成true。

邏輯操作符是一個(gè)前綴操作符, 并立即出現(xiàn)在它修飾的值之前,沒(méi)有任何空白,它被解讀為”不是”, 見(jiàn)下面的例子:

let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED"
這句話if !allowedEntry 能理解為 “if not allowedEntry.” 只執(zhí)行后續(xù)的行,如果“not allowedEntry” 是 true; 那就是說(shuō) if allowedEntry是false.

在這個(gè)例子中,精心挑選的布爾常量和變量名可以幫助保持代碼的可讀性和簡(jiǎn)潔,同時(shí)避免雙重否定或混亂的邏輯語(yǔ)句。

邏輯與運(yùn)算符

邏輯與運(yùn)算符:(A && B)創(chuàng)建的表達(dá)式中,A和B兩個(gè)值必須同時(shí)為true時(shí)表達(dá)式才正確。

其中A或者B有任一值是false時(shí),邏輯與算符表示不成立,必須兩者同時(shí)為true時(shí)才成立。事實(shí)上,如果第一個(gè)值是false,第二個(gè)值甚至不會(huì)再進(jìn)行判斷,因?yàn)楸仨毷莾蓚€(gè)值皆為true,已經(jīng)有一方false、則沒(méi)必要再往下面進(jìn)行判斷了。這被稱(chēng)作短路條件。

以下這個(gè)例子判斷兩個(gè)Bool 類(lèi)型的值,并只有這兩個(gè)值都為真的時(shí)候會(huì)輸出:Welcome。失敗則輸出”ACCESS DENIED”:

復(fù)制代碼代碼如下:

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    println("Welcome!")
} else {
    println("ACCESS DENIED")
}
// prints "ACCESS DENIED”

 

邏輯或運(yùn)算符

表達(dá)式(a || b)運(yùn)算符中、只要a或者b有一個(gè)為true,表達(dá)式就成立。

與上面的邏輯與運(yùn)算符相似,邏輯或運(yùn)算符使用短路條件判斷,如果左邊是 true,那么右邊不會(huì)被判斷,因?yàn)檎w結(jié)果不會(huì)改變了。

在下面的例子中,第一個(gè)布爾值(hasDoorKey)為false,但第二個(gè)值(knowsOverridePassword)為true。因?yàn)閮烧哂幸粋€(gè)值是true,整個(gè)表達(dá)式的計(jì)算結(jié)果也為true,正確輸出:Welcome!

復(fù)制代碼代碼如下:

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"

 

復(fù)合邏輯表達(dá)式

你可以將多個(gè)邏輯運(yùn)算符復(fù)合來(lái)創(chuàng)建更長(zhǎng)的復(fù)合表達(dá)式:

復(fù)制代碼代碼如下:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"

相比于之前兩個(gè)單獨(dú)分開(kāi)的運(yùn)算符,本次通過(guò)多重嵌套、將我們上面的&&、|| 運(yùn)算符相結(jié)合組合成一個(gè)較長(zhǎng)的復(fù)合表達(dá)式。看起來(lái)有點(diǎn)饒人、其實(shí)本質(zhì)還是兩兩相比較、可以簡(jiǎn)單地看成A && B || C || D、從左往右根據(jù)運(yùn)算符優(yōu)先級(jí)進(jìn)行判斷、注意區(qū)分開(kāi)&&、||、只要牢記運(yùn)算邏輯&&需要兩者都為true、||則只需要一方為true則運(yùn)算符正確即可解析整個(gè)復(fù)合表達(dá)式、透過(guò)現(xiàn)象看本質(zhì)。

 

明確地括號(hào)(翻譯成中文語(yǔ)句不連貫太特么饒人了、怒了自己理解。)

復(fù)合表達(dá)式中,我們可以添加進(jìn)()使確邏輯意圖更加明確,上面的例子中,我們可以在第一部分上加括號(hào)來(lái)使意義更明確。

復(fù)制代碼代碼如下:

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"

在復(fù)合邏輯表達(dá)式中、我們可以使用括號(hào)明確地表示我們需要將幾個(gè)值放在一個(gè)單獨(dú)的邏輯運(yùn)算中去判斷得出結(jié)果、最后根據(jù)()內(nèi)的結(jié)果再去與后面的值進(jìn)行判斷、看上面的例子、就像我們小學(xué)學(xué)加減乘除一樣、如果沒(méi)有括號(hào)()我們肯定是按照運(yùn)算符的優(yōu)先級(jí)去判斷、但此時(shí)有了括號(hào)、我們需要先運(yùn)算其中的邏輯運(yùn)算符得到它們的值.使用括號(hào)()在符合邏輯表達(dá)式中可以更明確的你的意圖。
 

注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 铜鼓县| 太仓市| 建宁县| 和政县| 婺源县| 永仁县| 西丰县| 深州市| 社旗县| 元江| 阳信县| 钟祥市| 甘泉县| 五河县| 获嘉县| 文昌市| 郧西县| 古蔺县| 沙坪坝区| 会宁县| 嘉义县| 正安县| 涡阳县| 西和县| 穆棱市| 雷波县| 西峡县| 湄潭县| 万山特区| 石家庄市| 根河市| 高邮市| 肇源县| 建昌县| 庆城县| 洛宁县| 开平市| 黄大仙区| 江陵县| 崇阳县| 黄大仙区|