Swift 操作符

Swift 支持重載操作符的特性马僻,讓我們可以自定義一些簡單的計算。
最經(jīng)典的例子就是兩個二維向量之間的計算了。

首先我們定義一個二維向量荡灾,并創(chuàng)建兩個向量

struct Vector2D {
    var x = 0.0
    var y = 0.0
}
let v1 = Vector2D(x: 2.0, y: 3.0)
let v2 = Vector2D(x: 1.0, y: 4.0)

相加兩個向量:

let v3 = Vector2D(x: v1.x + v2.x, y: v1.y + v2.y)

這樣一次的話,感覺還好瞬铸。但是遇到復雜的運算的話批幌,這樣寫感覺就太啰嗦了,這時候重載操作符是最好的選擇嗓节。

func +(left: Vector2D, right: Vector2D) -> Vector2D {
    return Vector2D(x: left.x + right.x, y: left.y + right.y)
}

這樣荧缘,我們相加兩個向量就簡單的多了

let v3 = v1 + v2
print(v3) // 輸出 Vector2D(x: 3.0, y: 7.0)

向量的內積運算符API中是沒有定義的,所以我們自定義一個內積運算符拦宣。
這里是Swift 3的實現(xiàn)方式(感覺看起來比之前的版本可讀性好多了)截粗。

// 自定義操作符 別名類型
infix operator +*: InnerProductPrecedence
// 自定義操作符的運算優(yōu)先級
precedencegroup InnerProductPrecedence {
//    結合律:內積的結果是一個 Double,不再會和其他內積結合使用恢着,所以這里寫成 none
    associativity: none
//    優(yōu)先級設置:高于普通運算桐愉。
//    MultiplicationPrecedence(代表乘法和除法)
//    AdditionPrecedence(代表加法和減法)
    higherThan: MultiplicationPrecedence, AdditionPrecedence
}

接下來我們就可以寫具體的運算實現(xiàn)了

func +*(left: Vector2D, right: Vector2D) -> Double {
    return left.x * right.x + left.y * right.y
}

let result = v1 +* v2 // 14

precedencegroup

定義了一個操作符優(yōu)先級別。操作符優(yōu)先級的定義和類型聲明有些相似掰派,一個操作符比需要屬于某個特定的優(yōu)先級从诲。Swift 標準庫中已經(jīng)定義了一些常用的運算優(yōu)先級組,比如加法優(yōu)先級 (AdditionPrecedence) 和乘法優(yōu)先級 (MultiplicationPrecedence) 等靡羡,你可以在這里找到完整的列表系洛。如果沒有適合你的運算符的優(yōu)先級組,你就需要像我們在例子中做得這樣略步,自己指定結合律方式和優(yōu)先級順序了描扯。

infix

表示要定義的是一個中位操作符,即前后都是輸入趟薄;其他的修飾還包括 prefix 和 postfix绽诚,不再贅述

associativity

定義了結合律,即如果多個同類的操作符順序出現(xiàn)的計算順序杭煎。比如常見的加法和減法都是 left恩够,就是說多個加法同時出現(xiàn)時按照從左往右的順序計算 (因為加法滿足交換律,所以這個順序無所謂羡铲,但是減法的話計算順序就很重要了)蜂桶。點乘的結果是一個 Double,不再會和其他點乘結合使用也切,所以這里寫成 none

higherThan

運算的優(yōu)先級扑媚,點積運算是優(yōu)先于乘法運算的腰湾。除了 higherThan,也支持使用 lowerThan 來指定優(yōu)先級低于某個其他組疆股。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末费坊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子押桃,更是在濱河造成了極大的恐慌葵萎,老刑警劉巖导犹,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱凯,死亡現(xiàn)場離奇詭異,居然都是意外死亡谎痢,警方通過查閱死者的電腦和手機磕昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节猿,“玉大人票从,你說我怎么就攤上這事”踔觯” “怎么了峰鄙?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長太雨。 經(jīng)常有香客問我吟榴,道長,這世上最難降的妖魔是什么囊扳? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任吩翻,我火速辦了婚禮,結果婚禮上锥咸,老公的妹妹穿的比我還像新娘狭瞎。我一直安慰自己,他們只是感情好搏予,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布熊锭。 她就那樣靜靜地躺著,像睡著了一般雪侥。 火紅的嫁衣襯著肌膚如雪碗殷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天校镐,我揣著相機與錄音亿扁,去河邊找鬼。 笑死鸟廓,一個胖子當著我的面吹牛从祝,可吹牛的內容都是我干的襟己。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼牍陌,長吁一口氣:“原來是場噩夢啊……” “哼擎浴!你這毒婦竟也來了?” 一聲冷哼從身側響起毒涧,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤贮预,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后契讲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仿吞,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年捡偏,在試婚紗的時候發(fā)現(xiàn)自己被綠了唤冈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡银伟,死狀恐怖你虹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情彤避,我是刑警寧澤傅物,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站琉预,受9級特大地震影響董饰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜模孩,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一尖阔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榨咐,春花似錦介却、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至数焊,卻和暖如春永淌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佩耳。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工遂蛀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人干厚。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓李滴,卻偏偏與公主長得像螃宙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子所坯,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容