swift學習筆記之運算子過載

2021-07-12 04:53:33 字數 1798 閱讀 9029

/**

* 今天我們來談一談swift中的操作符過載,這一功能非常實用,但是也相當有風險。正所謂「能力越大責任越大」,這句話用來形容操作符過載最合適不過了。它可以令你的**更加簡潔,也可以讓乙個函式呼叫變得又臭又長。而對於那些沒怎麼讀過你的**的人來說,操作符的使用同時也會讓**的可讀性大打折扣。

無論你何時想採用運算子過載,你都需要考慮一下是否值得過載它而不是用乙個函式呼叫。函式呼叫或許頗費周折,但更能確切的表達它的功能(如果函式名恰到好處的話)。假如你要頻繁做類似於加減乘除賦值比較的操作,那麼運算子過載的確是個很合適的解決方案。

*//**

* swift中的過載運算子裡面還是有一些比較不錯的地方。你可以通過過載"=="算符來實現對自定義類的比較。假如你想實現這一功能你就需要使用equatable協議,equatable協議主要應用於泛型程式設計(有關swift的泛型程式設計可以參考這裡)。如果你按照equatable協議過載了"=="操作符,那麼你無需再過載"!="操作符(因為「!=」的過載就是"=="的邏輯否)。

*///globally scoped operator function

func == (left: temperature, right: temperature) -> bool

else

}//custom type itself

struct temperature:equatable

//test

let tempone = temperature(c: 15)

let temptwo = temperature(c: 35)

let tempthree = temperature(c: 15)

let onetwoequality = (tempone == temptwo) //stores: false

let onethreeequality = (tempone == tempthree) //stores: true

/*** 前面我討論了一下nsdate的減法,是因為它在被呼叫時隱藏了不少的假定條件。在這裡提醒一下:當你在考慮編碼中是否要實現過載運算子的時候可以想想這個示例。如果你想在**裡一直使用相同的unitflag來過載實現日期的減法,你需要多寫一些**來考慮多種情況。

如果你想過載內建型別以及不想修改(或者無法修改)的型別的運算子過載,你可以在擴充套件裡面新增這個過載函式。且這個過載函式需要為全域性作用域,並放在你隨便哪個擴充套件存放的檔案裡面。

有一些運算子是不能過載的,最為明顯的就是賦值運算"="(乙個等號)。

*//**

* swift提供了許多強大的、現代的程式設計特性,比如泛型、函式式程式設計、一等型別(first class)的列舉、結構體等特性。

*//**

* 但是現在還有另外乙個swift的特性,你應該知道並且會愛上它,它就是運算子過載。

*///func add(left: [int], right: [int]) -> [int]

// return sum

//}//

//var arr1 = [1, 1]

//var arr2 = [1, 1]

//var arr3 = add(arr1, arr2)

/*** 現在你必須選擇乙個字元作為你的運算子。自定義運算子可以以/、=、-、+、!、*、%、<、>、&、|、^、~或者unicode字元開始。這個給了你乙個很大的範圍去選擇你的運算子。但是別太高興,選擇的時候你還必須考慮重複輸入的時候更少的鍵盤鍵入次數。

在這種情況下,你可以複製貼上unicode字元⊕作為很好適應你例子裡面加法的實現。

*////

swift 運算子過載

類和結構體可以位現有的運算子提供自定義的實現。成為運算子過載 code a uikit based playground for presenting user inte ce import uikit struct vector2d extension vector2d let vector ve...

swift 過載運算子

1 自定義乙個 運算子,左邊是string型別,右側為int型別 func left string,right int string let b 10 10 println b 0 3 自定義乙個單項事運算子 postfix func left double string println 0.0 4...

Swift 運算子過載專題

import foundation struct vector3 var va vector3 x 1,y 2,z 3 var vb vector3 x 4,y 5,z 6 func left vector3,right vector3 vector3 va vb func left vector3...