Swift學(xué)習(xí)筆記(基本運算符)

1.術(shù)語

運算符分為 一元/二元/三元 運算符

  • 一元運算符對單一對象(如 -a)让禀。一元運算符分前置運算符和后置運算符摧莽,前置運算符需緊跟在操作對象之前(如 !b)庙洼,后置運算符需緊跟在操作對象之后(如 c!)。
  • 二元運算符操作兩個操作對象(如 2 + 3)范嘱,是中置的送膳,因為它們出現(xiàn)在兩個操作對象之間。
  • 三元運算符操作三個操作對象丑蛤,和 C 語言一樣叠聋,Swift 只有一個三元運算符,就是三目運算符(a ? b : c)受裹。
  • 受運算符影響的值叫操作數(shù)碌补,在表達式 1 + 2 中,加號 + 是二元運算符棉饶,它的兩個操作數(shù)是值 1 和 2厦章。

2.賦值運算符 : =

var  a = 5 //表示用 5 來初始化 a 的值
let b = 10 //表示用10 來初始化b的值
a = b // 表示用 b 的值來更新 a 的值

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

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

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

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

//注意這里的錯誤寫法有點像 if let / var 的寫法,但是它們之間是不一樣的 ,上面這種寫法是錯誤的

3.算術(shù)運算符

  • 加(+) 減(-) 乘(*) 除(/)
let a = 1 + 2
let b = 2 - 1
let c = 1 * 1
let d = 1 / 1

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

var a = Int8.max  // 此時a == 127
var b = Int8.min // 此時 b == - 128
a = a + 1 //編譯會報錯,因為 a 在運算過程中出現(xiàn)溢出
b = b - 1 //編譯會報錯,因為 b 在運算過程中出現(xiàn)溢出
print(a)
print(b)

Swift 的 + 號運算符還可以應(yīng)用于字符串之間的拼接

"aaa" + "bbb"  // 拼接結(jié)果: aaabbb

4.求余運算符 %

9 % 4    // 等于 1

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

let a = 9
let b = -2
let c = 2
print(a % b)//結(jié)果是1
print(a % c)//結(jié)果是1
4.1一元負號運算符(-) 與 一元正號運算符(+)

它們與操作數(shù)之間不可以有空格

let a = -1 
let b = +1

5.組合賦值運算符

var a = 1
a +=1 //a 等于2 ,這個表達式和 a + 1 的作用是一樣的

var b = 2
b -= 1 //b 等于 1 ,這個表達式和 b - 1 的作用是一樣的

b

注意:Swift 中沒有了 a++ 或者說 ++a 的寫法了,

6. 比較運算符

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

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

注意: Swift 也提供恒等(===)和不恒等(!==)這兩個比較符來判斷兩個對象是否引用同一個對象實例栏尚。更多細節(jié)在類與結(jié)構(gòu)起愈。
新手在此處是無法理解 === 的

6.1 字符串之間的比較

在Swift中一般情況下是用String來代替NSString, 在比較兩個字符串之間的關(guān)系是所使用的方法也不一樣:

//案例代碼
let name: String  =  "prf"

if name == "prf" {
    print( " 兩個字符串相等 ")
}else{
    print(" 兩個字符串不一樣")
}

具體細節(jié)在Swift 中 NSString 與 String 的認識

6.2 元組之間的比較
let dog = (name: "dog" ,age : 2) //給元素命名的定義方法
let cat = ("cat",2)//不給元素命名的定義方法

if dog == cat {
    print(" dog 等于 cat ")/
}else{
    print(" dog 不等于 cat ")
}
//輸出結(jié)果:  dog 不等于 cat


if dog > cat {
    print(" dog 大于 cat ")/
}else{
    print(" dog 小于 cat ")
}
//輸出結(jié)果: dog 大于 cat

//判斷原理,從第一個元素開始比較,如果一致,則繼續(xù)往下比較,如果不一致,
//則開始比較第一個不一致的元素之間的差別,
//"dog" 與 "cat"比較 , 先比較 第一個字母 d 與 c 
  • 如果元組之間的元素個數(shù)不一樣,是不能拿來被比較的
  • 如果兩個元組在相同位置的元素的數(shù)據(jù)類型不一致,也是不能比較的
  • 如果元組中包含布爾值,則不能被比較大小,因為比較運算符不能直接比較布爾值之間的大小

7.三目運算符

書寫格式 問題 ? 答案 1 : 答案 2 ,它簡潔地表達根據(jù) 問題成立與否作出二選一的操作,如果 問題 成立,返回 答案 1 的結(jié)果译仗;反之返回 答案 2 的結(jié)果抬虽。

//三目運算符是以下代碼的縮寫形式:
question ? answer1 : answer2
if question {
    answer1
} else {
    answer2
}

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

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

8.空合運算符

空合運算符(a ?? b)將對可選類型 a 進行空判斷产艾,如果 a 包含一個值就進行解封,否則就返回一個默認值 b。表達式 a 必須是 Optional 類型闷堡。默認值 b 的類型必須要和 a 存儲值的類型保持一致隘膘。

//示例代碼
let a: Int? = 1 // 注意此處a 必須定義為可選值
let b: Int = 2  //注意此處 b 的數(shù)據(jù)類型和 a 的數(shù)據(jù)類型必須一致
//常規(guī)的判斷表達方法
let c = a != nil ? a : b //這是一種三目寫法,并且C被系統(tǒng)判斷為可選值
//使用空合運算符的寫法
let c = a ?? b //這里c被判斷為普通整型

9.區(qū)間運算符

9.1 閉區(qū)間運算符

(a...b)定義一個包含從 a 到 b(包括 a 和 b)的所有值的區(qū)間。a 的值不能超過 b杠览。 ? 閉區(qū)間運算符在迭代一個區(qū)間的所有值時是非常有用的弯菊,如在 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
9.2 半開區(qū)間運算符

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

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

數(shù)組有 4 個元素,但 0..<count 只數(shù)到3(最后一個元素的下標(biāo))软舌,因為它是半開區(qū)間才漆。關(guān)于數(shù)組,請查閱數(shù)組佛点。

9.3 單側(cè)區(qū)間

閉區(qū)間操作符有另一個表達形式醇滥,可以表達往一側(cè)無限延伸的區(qū)間 —— 例如,一個包含了數(shù)組從索引 2 到結(jié)尾的所有值的區(qū)間超营。在這些情況下鸳玩,你可以省略掉區(qū)間操作符一側(cè)的值。這種區(qū)間叫做單側(cè)區(qū)間演闭,因為操作符只有一側(cè)有值不跟。例如:

for name in names[2...] { //這句代碼可以理解為:從數(shù)組的第二位元素開始遍歷
    print(name)
}
// Brian
// Jack

for name in names[...2] {//這句代碼可以理解為:從數(shù)組的第1位元素遍歷到倒數(shù)第二位
    print(name)
}
// Anna
// Alex
// Brian

半開區(qū)間操作符也有單側(cè)表達形式,附帶上它的最終值米碰。就像你使用區(qū)間去包含一個值窝革,最終值并不會落在區(qū)間內(nèi)。例如:

for name in names[..<2] { //從第一位遍歷到第二位
    print(name)
}
// Anna
// Ale

單側(cè)區(qū)間不止可以在下標(biāo)里使用见间,也可以在別的情境下使用聊闯。你不能遍歷省略了初始值的單側(cè)區(qū)間,因為遍歷的開端并不明顯米诉。你可以遍歷一個省略最終值的單側(cè)區(qū)間菱蔬;然而,由于這種區(qū)間無限延伸的特性史侣,請保證你在循環(huán)里有一個結(jié)束循環(huán)的分支拴泌。你也可以查看一個單側(cè)區(qū)間是否包含某個特定的值,就像下面展示的那樣惊橱。

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

10.邏輯運算符(Logical Operators)

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

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

上面的三種運算符的單一使用太過簡單,此處不做筆記詳細使用

10.1 邏輯運算符組合計算
let enteredDoorCode = true //密碼正確與否的布爾值
let passedRetinaScan = false //是否通過了虹膜掃描
let hasDoorKey = false //是否有鑰匙
let knowsOverridePassword = true  //是否知道重置密碼的方法

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
//注意: Swift 邏輯操作符 && 和 || 是左結(jié)合的税朴,
//這意味著擁有多元邏輯操作符的復(fù)合表達式優(yōu)先計算最左邊的子表達式回季。
//上面代碼的解讀:
//1.如果我們輸入了正確的密碼 并且 (&&) 通過了視網(wǎng)膜掃描家制,
//2.或者 (||) 我們有一把有效的鑰匙,
//3.又或者 (||) 我們知道緊急情況下重置的密碼泡一,
//4.我們就能把門打開進入颤殴。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鼻忠,隨后出現(xiàn)的幾起案子涵但,更是在濱河造成了極大的恐慌,老刑警劉巖帖蔓,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矮瘟,死亡現(xiàn)場離奇詭異,居然都是意外死亡塑娇,警方通過查閱死者的電腦和手機澈侠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钝吮,“玉大人埋涧,你說我怎么就攤上這事∑媸荩” “怎么了棘催?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耳标。 經(jīng)常有香客問我醇坝,道長,這世上最難降的妖魔是什么次坡? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任呼猪,我火速辦了婚禮,結(jié)果婚禮上砸琅,老公的妹妹穿的比我還像新娘宋距。我一直安慰自己,他們只是感情好症脂,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布谚赎。 她就那樣靜靜地躺著,像睡著了一般诱篷。 火紅的嫁衣襯著肌膚如雪壶唤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天棕所,我揣著相機與錄音闸盔,去河邊找鬼。 笑死琳省,一個胖子當(dāng)著我的面吹牛迎吵,可吹牛的內(nèi)容都是我干的躲撰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼钓觉,長吁一口氣:“原來是場噩夢啊……” “哼茴肥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荡灾,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞬铸,沒想到半個月后批幌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡嗓节,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年荧缘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦宣。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡截粗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸵隧,到底是詐尸還是另有隱情绸罗,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布豆瘫,位于F島的核電站珊蟀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏外驱。R本人自食惡果不足惜育灸,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昵宇。 院中可真熱鬧磅崭,春花似錦、人聲如沸瓦哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭煎。三九已至恩够,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羡铲,已是汗流浹背蜂桶。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留也切,地道東北人扑媚。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓腰湾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疆股。 傳聞我的和親對象是個殘疾皇子费坊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)頁 = HTML+CSS+JavaScript 瀏覽器渲染機制: 1、 解析HTML標(biāo)簽旬痹,構(gòu)建DOM樹2附井、 解析...
    PYFang閱讀 172評論 0 0
  • nice to see you.
    樓下超市閱讀 154評論 0 0
  • 周六醒來后已經(jīng)八點二十了,抬抬頭她已經(jīng)走了两残,于是換了睡衣也起床了永毅。 刷牙洗臉時,看到她的暖瓶還在宿舍人弓,心中有點...
    舞薇薇閱讀 262評論 0 0
  • 《尋味:舌尖上的天地緣》:“清晨沼死、日落,豆?jié){崔赌、蛋湯意蛀,穩(wěn)穩(wěn)坐在干凈的餐桌旁,細細品味每一種食材的身世健芭、滋味县钥。感謝它們...
    李艷平閱讀 591評論 0 0
  • 我們都想成為彼此 但我們都不夠勇敢 01 其實你知道嗎魁蒜,我好羨慕你啊,有規(guī)律和計劃的活著吩翻! 你說這句話的時候兜看,用力...
    哎喲音樂閱讀 268評論 0 0