Swift 5.1 (2) - 運算符

運算符的術(shù)語:操作符分為一元浮还,二元,三元。

  • 一元運算符主要操作一個單一的目標(biāo)(比如:-a)。一元前綴運算符可以直接出現(xiàn)在它們的目標(biāo)前面(比如:!b)迅诬,一元后綴運算符直接出現(xiàn)在它們目標(biāo)之后(比如:c!)。
  • 二元運算符在兩個目標(biāo)(例如2 + 3)上運行婿牍,并且是中綴百框,因為它們出現(xiàn)在兩個目標(biāo)之間。
  • 三元運算符在三個目標(biāo)上進(jìn)行運算牍汹。與C一樣铐维,Swift只有一個三元運算符,即三元條件運算符(a慎菲?b:c)

賦值運算符: 賦值運算符(a = b)使用b值初始化或更新a的值嫁蛇。

let b = 10
var a = 5
a = b //a的值變?yōu)榱?0

如果賦值的右側(cè)是具有多個值的元組,則元組的元素可以一次分解為多個常量或變量露该。

let (x, y) = (1, 2)//!< x = 1 , y = 2

與C和Objective-C中的賦值運算符不同睬棚,Swift中的賦值運算符本身不返回值。以下聲明無效

 if x = y {//!< '='運算符在swift中沒有返回值,所以此處這樣寫是無效的抑党,同時會報錯包警。
        }

此功能可防止在實際使用等于運算符==時意外使用賦值運算符=,通過使x = y無效底靠,Swift可以幫助我們避免代碼中的這類錯誤害晦。

算數(shù)運算符

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

與C和Objective-C中的算術(shù)運算符不同,Swift算術(shù)運算符默認(rèn)情況下不允許值溢出暑中。我們可以通過使用Swift的溢出運算符(例如&+ b)來選擇值溢出行為壹瘟。請參閱溢出運算符
字符串連接也支持加法運算符:

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

求余運算符:余數(shù)運算符(a%b)計算出a中將包含多少個b,并返回剩余的值(稱為余數(shù))

9 % 4    // equals 1
-9 % 4   // equals -1

一元-+運算符:可以使用-(稱為一元減運算符)直接添加于運行的值之前鳄逾,沒有任何空格稻轨,切換數(shù)值的符號。使用+(稱為一元加運算符)直接添加于運行的值之前雕凹,沒有任何空格殴俱,一元加運算符+只返回它操作的值,沒有任何變化枚抵。
一元減運算符

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

即使一元加運算符實際上沒有做任何事情线欲,但是當(dāng)使用一元減運算符作為負(fù)數(shù)時,我們可以使用它來為代碼提供正數(shù)的對稱性俄精。
復(fù)合賦值運算符::與C一樣询筏,Swift提供了將賦值=與另一個操作符相結(jié)合的復(fù)合賦值運算符。比如加法賦值運算符+ =

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

表達(dá)式a += 2a = a + 2的簡寫竖慧。實際上嫌套,加法和賦值操作符被組合成一個同時執(zhí)行兩個任務(wù)的運算符。
需要注意的是:復(fù)合賦值運算符不返回值圾旨。例如:不能寫let b = a += 2踱讨。
比較運算符: Swift支持所有標(biāo)準(zhǔn)C比較運算符。

  • 等于 == , 如:(a == b)
  • 不等于!=, 如: (a != b)
  • 大于>, 如: (a > b)
  • 小于<, 如: (a < b)
  • 大于等于>=, 如: (a >= b)
  • 小于等于!=, 如: (a <= b)
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" {
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".

比較元組:如果它們具有相同的類型和相同的數(shù)值痹筛,則可以比較兩個元組。元組從左到右進(jìn)行比較廓鞠,一次一個值帚稠,直到比較發(fā)現(xiàn)兩個不相等的值。比較這兩個值床佳,并且該比較的結(jié)果確定元組比較的總體結(jié)果滋早。如果所有元素都相等,則元組本身是相等的砌们。即:在可以比較的前提下杆麸,只要按順序比較找到兩個元組中不相同的兩個值搁进,則進(jìn)行比較并且返回,作為元組的比較結(jié)果昔头,后面的值將不再進(jìn)行比較例如:

(1, "zebra") < (2, "apple")   //返回 true 因為1 小于2  "zebra" 和 "apple" 將不比較:“ zebra”不小于“apple”并不重要饼问,因為比較已經(jīng)由元組的第一個元素決定,當(dāng)元組的第一個元素相同時揭斧,它們的第二個元素會被比較莱革。
但是,當(dāng)元組的第一個元素相同時未蝌,它們的第二個元素會被比較驮吱,下面就是這種情況
(3, "apple") < (3, "bird")    // 返回 true 因為 3 等于 3, "apple"小于"bird"
(4, "dog") == (4, "dog")      //返回 true 因為 4 等于 4, "dog" 等于"dog"

另:只有當(dāng)給定運算符可以應(yīng)用于相應(yīng)元組中的每個值時茧妒,才能將元組運用給定運算符進(jìn)行比較萧吠。
例如,如下面的代碼所示桐筏,您可以比較兩個類型(String纸型,Int)的元組,因為可以使用<運算符比較StringInt值梅忌。相反狰腌,兩個類型(String,Bool)的元組不能與<運算符進(jìn)行比較牧氮,因為<運算符不能應(yīng)用于Bool值琼腔。

if ("blue", -1) < ("purple", 1)  {
    print("結(jié)果成立,返回了true")
}
if ("blue", false) < ("purple", true) {//!< 編譯器直接會報錯
    print("Binary operator '<' cannot be applied to two '(String, Bool)' operands")
}

Swift標(biāo)準(zhǔn)庫包含的比較元組時踱葛,只限于元組少于7個元素丹莲。要將元組與七個或更多元素進(jìn)行比較,我們必須自己實現(xiàn)比較運算符尸诽。

另外:Swift還提供了兩個標(biāo)識運算符(===和!==)甥材,用于測試兩個對象引用是否都引用同一個對象實例
身份運算符: 因為類是引用類型,所以多個常量和變量可能引用同一個類的單個實例性含。(對于結(jié)構(gòu)體和枚舉洲赵,情況也是如此,因為它們在分配給常量或變量或傳遞給函數(shù)時總是被復(fù)制)Swift 提供了兩個身份運算符來找出兩個常量或變量是否完全引用類的相同實例商蕴。

  • 相同 (===)
  • 不相同 (!==)

注意:相同===并不意味著等于==叠萍。===意味著類類型(class type)的兩個常量或變量引用了完全相同的類實例。等于意味著兩個實例在值上被認(rèn)為是相等的绪商。
1.obj1和obj2常量都是類類型苛谷,兩者引用了不相同的類的實例對象

let obj1 = UIView.init()
let obj2 = UIView.init()
let (x,y) = (obj1,obj2)
if x === y {
   print("obj1和obj2常量都是類類型,并且兩者引用了完全相同的類的實例對象")
} else{
   print("obj1和obj2常量都是類類型部宿,兩者引用了不相同的類的實例對象")//!< 打印結(jié)果
}
  1. obj1和obj2常量都是類類型抄腔,并且兩者引用了完全相同的類的實例對象
let obj1 = UIView.init()
let obj2 = obj1
let (x,y) = (obj1,obj2)
if x !== y {
    print("obj1和obj2常量都是類類型瓢湃,兩者引用了不相同的類的實例對象")
} else{
    print("obj1和obj2常量都是類類型,并且兩者引用了完全相同的類的實例對象")//!< 打印結(jié)果
}

三元條件運算符:三元條件運算符是一個特殊的運算符赫蛇,有三個部分绵患,使用用形式:question ? answer1 : answer2。如果問題為真悟耘,則返回answer1落蝙;否則返回answer2。
三元條件運算符是以下代碼的簡寫:

if question {
    answer1
} else {
    answer2
}

可Nil合并(Nil-Coalescing)運算符:nil-coalescing運算符??解包一個可選的a使用形式:a ?? b暂幼。解讀為:解包可選a筏勒;如果anil,則返回默認(rèn)值b旺嬉,否則返回a管行。表達(dá)式中a始終是可選類型。并且b必須與a的類型匹配邪媳。
nil-coalescing運算符是下面代碼的簡寫:

a! =  nil  ?  a!  :  b //<! 使用三元條件運算符和強(qiáng)制解包(a>枨辍)來訪問包含在a不是nil時的值,否則返回b

上面的代碼使用三元條件運算符和強(qiáng)制解包a雨效!來訪問包含在可選的a中的值迅涮,若不是nil時,則不去管b的值徽龟,并返回a中的值叮姑,否則返回b

let defaultColorName = "red"
var userDefinedColorName: String?   // defaults to nil
var colorNameToUse = userDefinedColorName ?? defaultColorName

返回運算符: Swift包含多個范圍運算符据悔。
1.封閉范圍運算符(Close Range Operator):封閉范圍運算符...传透,使用形式(a ... b)定義從ab的范圍,并包括值ab并且a的值不得大于b屠尊。
當(dāng)我們希望在所有值的全部范圍內(nèi)進(jìn)行遍歷時旷祸,閉合范圍運算符非常有用,例如使用for-in循環(huán):

for item in 1...8 {
    print(item)//!< 打印 12345678
}

2.半開范圍運算符(Half-Open Range Operator):半開范圍運算符..<使用形式:a .. <b定義從ab的范圍讼昆,但不包括b托享,它被認(rèn)為是半開放的,因為只包含它的第一個值卻沒有它的最終值浸赫。與封閉范圍運算符一樣闰围,a的值不得大于b。如果a的值等于b既峡,則最終有效范圍將為空羡榴。
當(dāng)我們遍歷基于零的列表(如數(shù)組),因為數(shù)組的長度需要計算运敢,此時根據(jù)定義校仑,使用半開范圍運算符是最合適的忠售。

/*打印結(jié)果:
 索引:0,對應(yīng)字符串:i
 索引:1,對應(yīng)字符串:am
 索引:2,對應(yīng)字符串:zhangfei
*/
let array = ["i","am","zhangfei"]
for index in 0 ..< array.count { //!< 遍歷數(shù)組
    print("索引:\(index),對應(yīng)字符串:\(array[index])")
}
//直接輸出字符串,形式
let array = ["i","am","zhangfei"]
for str in array[0..<array.count] {
    print(str)
}

3.局部(單面/側(cè))范圍(One-Sided Ranges):封閉范圍運算符(Close Range Operator)半開范圍運算符(Half-Open Range Operator)的使用延伸。
封閉范圍運算符有一個替代形式迄沫,用于使范圍在一個方向上盡可能繼續(xù)稻扬。例如:一個數(shù)組從索引位置2到數(shù)組末尾的所有元素的范圍。這種情況下我們可以省略運算符一側(cè)的值羊瘩。具體使用:

let array = ["i","am","zhangfei"]
//直接輸出字符串 形式1
for str in array[...]{
    print(str)
}
//直接輸出字符串 形式2 此處`1`可以是數(shù)組范圍內(nèi)小于`array.count-1`的任意值
for str in array[1...] {
    print(str)
}
//直接輸出字符串 形式3 此處`(array.count-1)`可以是數(shù)組范圍內(nèi)大于0的任意值
for str in array[...(array.count-1)] {
    print(str)
}

半開放范圍操作符也具有單側(cè)形式泰佳,僅使用其最終值編寫,最終值不是范圍的一部分尘吗,因為是小于<逝她。具體使用

//直接輸出字符串 形式4 
for str in array[..<array.count] {
    print(str)
}

局部(單面/側(cè))范圍(One-Sided Ranges)可以在其他上下文中使用,而不僅僅在下標(biāo)中使用睬捶。在需要遍歷的情況下不能忽略了單側(cè)范圍的第一個值黔宛,因為遍歷需要清楚的知道應(yīng)該從哪里開始。我們卻可以使用忽略了最終值單側(cè)范圍侧戴,但是范圍可以無限期的繼續(xù)宁昭,所以需要確保為我們的循環(huán)添加顯式結(jié)束條件跌宛,我們還可以檢查單側(cè)范圍是否包含特定的值酗宋。具體示例如下:

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

關(guān)于范圍可以無限期的繼續(xù),所以需要確保為我們的循環(huán)添加顯式結(jié)束條件舉例如下:

let range =  0...
for i in range {//!< 代碼無限期的執(zhí)行
    print(i)
}

邏輯運算符: 邏輯運算符修改Boolean邏輯值為truefalse疆拘。
Swift支持基于C語言的三個標(biāo)準(zhǔn)邏輯運算符蜕猫。

  • 邏輯非 ! 如:!a
  • 邏輯與 &&如:a && b
  • 邏輯或 ||如:a || b

參考資料:
swift 5.1官方編程指南

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哎迄,隨后出現(xiàn)的幾起案子回右,更是在濱河造成了極大的恐慌,老刑警劉巖漱挚,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔烁,死亡現(xiàn)場離奇詭異,居然都是意外死亡旨涝,警方通過查閱死者的電腦和手機(jī)蹬屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白华,“玉大人慨默,你說我怎么就攤上這事』⌒龋” “怎么了厦取?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長管搪。 經(jīng)常有香客問我虾攻,道長铡买,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任霎箍,我火速辦了婚禮寻狂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朋沮。我一直安慰自己蛇券,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布樊拓。 她就那樣靜靜地躺著纠亚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筋夏。 梳的紋絲不亂的頭發(fā)上蒂胞,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音条篷,去河邊找鬼骗随。 笑死,一個胖子當(dāng)著我的面吹牛赴叹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乞巧,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼涨椒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绽媒?” 一聲冷哼從身側(cè)響起蚕冬,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎是辕,沒想到半個月后囤热,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡获三,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年旁蔼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片石窑。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡牌芋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出松逊,到底是詐尸還是另有隱情躺屁,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布经宏,位于F島的核電站犀暑,受9級特大地震影響驯击,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耐亏,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一徊都、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧广辰,春花似錦暇矫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至几睛,卻和暖如春房轿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背所森。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工囱持, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焕济。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓纷妆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吼蚁。 傳聞我的和親對象是個殘疾皇子凭需,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

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