Swift運算符重載介紹

1、簡介

Swift中類或結構體可以對已有的運算符進行自定義實現(xiàn)喻括,賦予另外一種功能邀杏。可以成為運算符函數(shù)唬血,即運算符重載望蜡。

2、運算符函數(shù)

2.1拷恨、雙目運算符

下面將通過例子展示自定義結構體如何實現(xiàn)加法運算符(+)和減法運算符(-)脖律,加法運算符和減法運算符是雙目運算符,可以對兩個值進行運算腕侄,并且在兩個值之間小泉。
例子中定義了一個Coordinate的結構體,包含x和y兩個值冕杠,表示平面坐標系上面的點微姊。

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
}

extension Coordinate {
    static func +(lhs: Coordinate, rhs: Coordinate) -> Coordinate {
        coordinate = Coordinate(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }

    static func -(lhs: Coordinate, rhs: Coordinate) -> Coordinate {
        coordinate = Coordinate(x: lhs.x - rhs.x, y: lhs.y - rhs.y)
    }
}

上述兩個運算符函數(shù)被定義為Coordinate的類方法,運算符函數(shù)名和重載的運算符保持一致分预。加法運算符(+)和減法運算符(-)是雙目運算符兢交,因此接收兩個Coordinate類型的參數(shù),返回一個Coordinate類型的返回值笼痹。
上述兩個類方法可以在任意兩個Coordinate實例之間作為中綴運算符使用:

let point = Coordinate(x: 1.0, y: 1.0)
let anotherPoint = Coordinate(x: 2.0, y: 2.0)
    
let resultPoint1 = point + anotherPoint
let resultPoint2 = point - anotherPoint
    
print(resultPoint1)
print(resultPoint2)

這個例子中實現(xiàn)了(1.0魁淳,1.0)和(2.0,2.0)兩個點的相加和相減与倡,得到兩個新的點(3.0界逛,3.0)和(-1.0,-1.0)

Coordinate(x: 3.0, y: 3.0)
Coordinate(x: -1.0, y: -1.0)

2.2纺座、前綴運算符息拜、后綴運算符

2.1節(jié)的兩個運算符函數(shù)實現(xiàn)了雙目運算的自定義實現(xiàn)。類和結構體也可以實現(xiàn)單目運算符,單目運算符只運算一個值少欺。運算符出現(xiàn)在值之前為前綴運算符喳瓣,出現(xiàn)在值之后為后綴運算符。
實現(xiàn)單目運算符需在在聲明運算符函數(shù)時在func關鍵字之前添加prefix(前綴)(例如:-a)或postfix(后綴)(例如:bT薇稹)修飾符畏陕。

extension Coordinate {
    static prefix func +(coordinate: Coordinate) -> Coordinate {
         return Coordinate(x: +coordinate.x, y: +coordinate.y)
    }

    static prefix func -(coordinate: Coordinate) -> Coordinate {
         return Coordinate(x: -coordinate.x, y: -coordinate.y)
    }
}

上述的兩個運算符函數(shù)為單目運算運算符函數(shù)。由于是前綴運算符仿滔,需要在
func關鍵字之前加上prefix修飾符惠毁。
上述兩個運算符函數(shù)只對Coordinate實例的x、y做簡單的正負改變:

 let point = Coordinate(x: 1.0, y: 1.0)
 let anotherPoint = Coordinate(x: 2.0, y: 2.0)

 print(-point)
 print(+anotherPoint)

這個例子中對(1.0崎页,1.0)和(2.0鞠绰,2.0)兩個點進行正負運算,輸出結果為:

Coordinate(x: -1.0, y: -1.0)
Coordinate(x: 2.0, y: 2.0)

2.3飒焦、復合賦值運算符

復合賦值運算符是賦值運算符(=)和其他運算符進行結合蜈膨。例如加法運算符(+)和賦值運算符(=)相結合組成加法賦值運算符(=+)。復合賦值運算符函數(shù)需要將左值進行inout關鍵修飾牺荠,因為在函數(shù)內部要對左值進行直接的修改翁巍。

extension Coordinate {
    static func +=(lhs: inout Coordinate, rhs: Coordinate) {
        lhs = Coordinate(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
    }

    static func -=(lhs: inout Coordinate, rhs: Coordinate) {
        lhs = Coordinate(x: lhs.x - rhs.y, y: lhs.y - rhs.y)
    }
}

上述兩個運算符函數(shù)實現(xiàn)了加法賦值運算符和減法賦值運算符的自定義。

var point = Coordinate(x: 1.0, y: 1.0)
let anotherPoint = Coordinate(x: 2.0, y: 2.0)
    
point += anotherPoint
print(point)

由于符合賦值運算符函數(shù)的左值進行了inout修飾休雌,運算的結果是對左值進行直接的修改灶壶,輸入結果為:

Coordinate(x: 3.0, y: 3.0)

注意:不能對默認的賦值運算符(=)進行重載,只有復合賦值運算符可以重載挑辆。三目條件運算符(a ? b : c)也不能進行重載例朱。

2.4、等價運算符

自定義類和結構體沒有對等價運算符進行默認的實現(xiàn)鱼蝉。等價運算符一般被稱為相等運算符(==)和不等運算符(!=)洒嗤。
對于自定義的類型,Swift無法進行判等運算魁亦,因為“相等”的含義取決于自定義類型在代碼中扮演的角色渔隶。為了使自定義類型能夠進行等價運算,我們可以對等價運算符進行自定義實現(xiàn)洁奈。

extension Coordinate {
    static func ==(lhs: Coordinate, rhs: Coordinate) -> Bool {
        if lhs.x == rhs.x && lhs.y == rhs.y {
            return true
        }
        return false
    }

    static func !=(lhs: Coordinate, rhs: Coordinate) -> Bool {
        if lhs.x != rhs.x || lhs.y != rhs.y {
            return true
        }
        return false
    }
}

上述的運算符函數(shù)實現(xiàn)了“相等”運算符间唉,來判斷兩個Coordinate類型是否相等,對于Coordinate類型而言利术,相等表示兩個屬性“x”和“y”相等呈野;“不等”運算符表示只要Coordinate只要有一個屬性不相等,即可判斷為兩個Coordinate類型不相等印叁。

let point = Coordinate(x: 1.0, y: 1.0)
let anotherPoint = Coordinate(x: 2.0, y: 2.0)
    
print(point == anotherPoint)
print(point != anotherPoint)

由于point的兩個屬性x被冒、y和anotherPoint的兩個屬性x军掂、y值不相等,因此進行相等(==)運算的結果為false昨悼,進行不等(!=)的運算結果為true蝗锥。

2.5、自定義運算符

除了標準運算符率触,Swift還可以聲明和實現(xiàn)自定義運算符终议。
自定義運算符需要在全局作用域通過關鍵字operator進行定義,同時要指定prefix(前綴)葱蝗、infix(中綴)或postfix(后綴)修飾符:

prefix operator  +++

上面的代碼定義了一個名為+++的前綴運算符穴张。在Swift中+++并沒有實際的意義,我們可以通過Coordinate實例來定義它的意義垒玲。對于Coordinate類型來講陆馁,可以將+++定義為雙自增前綴運算符找颓,實現(xiàn)Coordinate對自身的相加合愈。

extension Coordinate {
    static prefix func +++(coordinate: inout Coordinate) -> Coordinate {
        coordinate += coordinate
        return coordinate
   }
}

上述中的運算符函數(shù)通過自定義的加法賦值運算符讓Coordinate實現(xiàn)自身的相加。

var point = Coordinate(x: 1.0, y: 6.0)
let anotherPoint = +++point

由于+++運算符實現(xiàn)對自身相加击狮,并輸出一個Coordinate實例佛析,因此上述例子中point的值最終的結果為(2.0,12.0)彪蓬,anotherPoint的值為(2.0寸莫,12.0)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末档冬,一起剝皮案震驚了整個濱河市膘茎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酷誓,老刑警劉巖披坏,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盐数,居然都是意外死亡棒拂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門玫氢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帚屉,“玉大人,你說我怎么就攤上這事漾峡」サ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵生逸,是天一觀的道長牢屋。 經常有香客問我掰邢,道長,這世上最難降的妖魔是什么伟阔? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任辣之,我火速辦了婚禮,結果婚禮上皱炉,老公的妹妹穿的比我還像新娘怀估。我一直安慰自己,他們只是感情好合搅,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布多搀。 她就那樣靜靜地躺著,像睡著了一般灾部。 火紅的嫁衣襯著肌膚如雪康铭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天赌髓,我揣著相機與錄音从藤,去河邊找鬼。 笑死锁蠕,一個胖子當著我的面吹牛夷野,可吹牛的內容都是我干的。 我是一名探鬼主播荣倾,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悯搔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舌仍?” 一聲冷哼從身側響起妒貌,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铸豁,沒想到半個月后灌曙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡推姻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年平匈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片藏古。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡增炭,死狀恐怖,靈堂內的尸體忽然破棺而出拧晕,到底是詐尸還是另有隱情隙姿,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布厂捞,位于F島的核電站输玷,受9級特大地震影響队丝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜欲鹏,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一机久、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赔嚎,春花似錦膘盖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至损晤,卻和暖如春软棺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尤勋。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工喘落, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斥黑。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓揖盘,卻偏偏與公主長得像眉厨,于是被迫代替她去往敵國和親锌奴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容

  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量服球、屬性茴恰、下標構造器協(xié)議擴展泛型類型別名位運算...
    寒橋閱讀 884評論 0 2
  • 高級運算符(Advanced Operators) 本文參考自蘋果官方文檔Advanced Operators本頁...
    果啤閱讀 1,594評論 1 5
  • 高級運算符 文檔地址 作為 基本運算符 的補充,Swift 提供了幾個高級運算符執(zhí)行對數(shù)傳值進行更加復雜的操作斩熊。這...
    hrscy閱讀 842評論 0 2
  • TARROOM超級密室(密室逃脫)隸屬于北京水木秋石文化傳播有限公司往枣,致力于打造新一代人機交互式體驗的真人實景機械...
    StarRoom閱讀 420評論 0 1
  • 今日逃課四節(jié),大睡一上午粉渠,酣暢淋漓分冈,好不痛快,循規(guī)蹈矩良久霸株,今日也算釋放了天性雕沉。有時候生命是編好的程序,是預設好的...
    小小河千閱讀 214評論 1 0