Swift教程之根本運算符詳解。本站提示廣大學習愛好者:(Swift教程之根本運算符詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift教程之根本運算符詳解正文
運算符是一種特定的符號或表達式,用來磨練、修正或歸並變量。例如,用乞降運算符+可以對兩個數字停止乞降(如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。
賦值運算符
賦值運算符(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 如許寫是有效的。
數學運算符
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)。詳見 Overflow Operators
加法運算符對字符串聯接也一樣實用,例如:
"hello, " + "world" // equals "hello, world"
兩個字符,或許一個字符一個字符串,能組分解一個新的字符串:
let dog: Character = "dog"(因為閱讀器不克不及顯示狗的unicode圖象,故用三個字母取代……)
let cow: Character = "cow"(同上……)
let dogCow = dog + cow
// dogCow is equal to "dogcow"
詳見Concatenating Strings and Characters
取余運算符
取余運算符(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, 由於他們修正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
固然一元加上運算符現實上不履行甚麼,當你也應用一元減正數的運算符時,你能應用它供給對稱的負數。
復合賦值操作符
Swift供給相似C說話的復合賦值操作符,即把賦值和另外一個運算歸並起來。舉個例子,像加法賦值運算符(+ =):
var a = 1
a += 2
// a is now equal to 3
表達式 a += 2 比 a = a + 2更精華精辟。加法賦值運算符可以或許有用地把加法和賦值組合到一個運算,同時履行這兩個義務。
要留意的是,復合賦值操作符不前往值。例如,你不克不及寫讓成let b = + = 2,這類行動分歧於下面提到的遞增和遞加運算符。
復合賦值運算符的完全列表可以在[Expressions]那一章節找到
比擬運算符
Swift支撐一切尺度c的比擬運算符
等於 (a == b)
不等於(a != b)
年夜於 (a > b)
小於 (a < b)
年夜於等於 (a >= b)
小於等於(a <= b)
注:Swift 供給兩個恆等運算符(=== and !==),用它來測試兩個對象援用能否來自於統一個對象實例。詳見Classes and Structures。 每一個比擬操作符前往一個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語句,請參閱掌握流。
三元前提運算符
三元前提運算符是一種特別的運算符,有三個部門,其情勢為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可以在一行代碼被設置為准確的值。這比第二個示例更簡練, 不須要課外的rowHeight變量, 由於它的價值不須要在一個if語句中修正。
三元前提運算符供給了一個高效的寫法來決議哪一個表達式會被履行。不外照樣請當心應用三元前提運算符,其簡練性假如過度應用會招致浏覽代碼的艱苦。要防止多個實例的三元前提運算符組分解一個復合語句。
規模運算符
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(數組中的最初一個項目標索引),由於它是一個半關閉的規模。欲懂得更多有關數組的信息,請參閱數組
邏輯運算符
邏輯運算符修正或聯合布爾邏輯值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 allowedEntry.” 只履行後續的行,假如“not allowedEntry” 是 true; 那就是說 if allowedEntry是false.
在這個例子中,精心遴選的布爾常量和變量名可以贊助堅持代碼的可讀性和簡練,同時防止兩重否認或凌亂的邏輯語句。
邏輯與運算符
邏輯與運算符:(A && B)創立的表達式中,A和B兩個值必需同時為true時表達式才准確。
個中A或許B有任一值是false時,邏輯與算符表現不成立,必需二者同時為true時才成立。現實上,假如第一個值是false,第二個值乃至不會再停止斷定,由於必需是兩個值皆為true,曾經有一方false、則沒需要再往上面停止斷定了。這被稱作短路前提。
以下這個例子斷定兩個Bool 類型的值,並只要這兩個值都為真的時刻會輸入:Welcome。掉敗則輸入”ACCESS DENIED”:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED”
邏輯或運算符
表達式(a || b)運算符中、只需a或許b有一個為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!"
在復合邏輯表達式中、我們可使用括號明白地表現我們須要將幾個值放在一個零丁的邏輯運算中去斷定得出成果、最初依據()內的成果再去與前面的值停止斷定、看下面的例子、就像我們小學學加減乘除一樣、假如沒有括號()我們確定是依照運算符的優先級去斷定、但此時有了括號、我們須要先運算個中的邏輯運算符獲得它們的值.應用括號()在相符邏輯表達式中可以更明白的你的意圖。