每天學一點Swift---- 運算符函數

運算符重載


1. Swift的運算符提供了良好的可擴展性,Swift不僅允許開發者重新定義已有的運算符(運算符重載),甚至允許開發者實現新的運算符。從本質上來看,Swift的運算符其實就是一個運算符函數,因此只要能用函數實現的功能,程序都可以講起轉換爲運算符。


2. 重新定義+-x/的運算符函數,實現自己認爲合理的功能就是運算符重載(函數重載),不再囉嗦。


3. 舉個例子,使用+對數組進行添加元素:

func + <T> (var left : [T], right : T) -> [T]

{

   left.append(right)

   return left

}


.前置和後置運算符

1. 重載單目運算符時,Swift允許指定單目運算符必須放在操作數的前面或後面,如果單目運算符必須放在操作數的前面,這種運算符被稱爲前置運算符;如果單目運算符必須放在操作數的後面,這種運算符被稱爲後置運算符。


2. 前置運算符必須使用prefix關鍵字修飾;後置運算符必須使用postfix關鍵字修飾。


3. 擴展後的賦值運算符:我們已經知道:a += b相當於a = a+b。實際上+=也是可以被重載的運算符。由於+=運算符會改變第一個操作數,因此程序重載+=運算符時需要將第一個操作數設置爲In-Out模式。除此之外,+=運算符的作用是改變第一個數的值,因此重載+=運算符時無須指定返回值類型。


.比較運算符

1. 如果程序要使用==!=>>=<<=這些運算符對自定義類型比較大小,則可以讓該自定義類型滿足如下兩個特徵:

1)遵守EquatableComparable兩個協議

2)對自定義類型重載==<兩個運算符


2. Swift並不要求程序重載!=>>=<=4個運算符,只要程序爲自定義類型重載了==<兩個運算符,Swift將會自動推斷出其他4個雲是個的比較結果。


3. 如果程序並不需要比較來兩個自定義類型的大小,只是比較它們相等或不相等,則只需要讓該自定義類型實現Equatable協議,併爲該自定義類型重載==運算符即可。


.自定義運算符

1. 除了上面的運算符重載之外,Swift甚至允許程序定義自己的運算符函數,如果程序定義了新的運算符函數,那就相當於爲Swift增加了新的運算符。


2. 新增運算符只能使用 =+-*/%<>、!、|^~這些符號。


3. 開發自定義四運算符只要如下兩步即可:

1)聲明新的運算符,格式如下:

    prefix|infix|postfix operator運算符名{}   ----prefixinfixpostfix三者只能出現一個,分別表示前置、雙目、後置。

2)根據業務需要,爲新的運算符提供多個重載的運算符函數。


4. 舉個栗子:

//爲新的運算符定義函數,用來實現乘方運算

func ** (base : Int, exponent : Int) -> Int

{

   var resule = 1

   for _ in 1...exponent

   {

       result *= base

   }

   return result

}


func ** (base : Double, exponent : Int) -> Int

{

   var result  = 1.0

   for _ in 1...exponent

   {

result *= base

   }

   return result

}


5. 自定義運算符的結合性(associativity)和優先級(precedence

1)運算符的結合性決定運算符是先和左邊操作數還是右邊操作數結合。結合性支持的值有left(左結合)、right(右結合)、none(非結合運算符)。

2)運算符的優先級決定該運算符是否會被優先計算。

3)自定義的infix運算符可以指定結合性和優先級,如果沒有爲自定義運算符指定結合性,該運算符的結合性默認爲none,如果沒有爲自定義運算符指定優先級,該運算符的優先級爲100


6. 下面的代碼重寫定義了**=運算符,並指定了該運算符的結合性和優先級:

infix operator **= {associativity left precedengce 90}



階段性小記

  歷時一個多月,終於將Swift的基礎語法過了一遍,離開發iOS又進了一步。雖然知識是看完了,但是記住了沒有多少,更不要說融會貫通了,所以接下來的一步就是要溫故而知新。把學習過的知識再從頭串聯一遍,並且要在代碼和demo中實踐起來了。所以接下來不會再注重日記的更新,而是要在有知識大體思路的框架逐步去深入學習具體的知識,然後把學習的內容用自己的方式加自己的想法記錄下來纔會更有效率吧,加油嘍!


上一篇:每天學一點Swift----泛型(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章