- Swift 4從零到精通iOS開發
- 張益琿
- 1739字
- 2019-12-09 14:31:27
6.2 運算符的重載與自定義
準確來說,重載運算符和自定義運算符都是開發者自定義運算符功能的手段,二者的差別在于重載運算符是給系統已經存在的運算符追加新的功能,而自定義運算符是完全自定義一個系統不存在的運算符來實現特定的運算功能。
6.2.1 重載運算符
讀者在認識重載運算符前,首先應該清楚重載的概念。重載的概念最初是針對函數的,對同一個函數名,設置不同的參數類型以實現不同的功能被稱為函數的重載。在Objective-C中函數參數的名稱是包含在函數名里的,因此從嚴格意義上講,Objective-C語言并不存在函數的重載操作。Swift語言則不同,我們可以通過對函數重載應用的一個小例子來理解重載的意義。
實現一個整數的加法函數十分簡單,示例如下:

上面的示例代碼用來進行整型數據的加法是完全可以的,但是如果需要進行浮點型數據的加法就會出現問題,開發者如果直接將浮點數傳入addFunc()函數中,編譯器就會直接報類型錯誤,這時你可能想要創建一個針對浮點數的加法運算,示例如下:

這樣是解決了問題,但是這種設計思路十分糟糕,實現相同功能的函數,由于參數的不同被生生切成了兩個,其實開發者可以使用相同的函數名addFunc(),通過重載實現不同類型參數的計算,示例如下:

如上代碼,通過重載的方式對不同數據類型實現了加法操作,并且在調用加法函數的時候,開發者只需要記住這一個函數名即可,這就大大增強了代碼的統一性。
類比于函數的重載,運算符的重載是指在系統已經存在的運算符上擴展新的功能。其實在前面章節中使用的加號運算符“+”就是通過重載實現的,開發者可以直接使用“+”運算符進行整型數據、浮點型數據甚至字符串類型數據的相加操作。下面我們通過自定義一個圓形的類,通過重載加號運算符“+”來實現支持對圓形類實例的相加操作。
設計圓形類如下,其中有兩個屬性,分別表示圓形半徑與圓心:

定義兩個Circle實例進行相加操作時,應執行這樣的運算:兩個Circle實例相加返回一個新的Circle實例,并且這個新的Circle實例的圓心為第一個Circle操作數的圓心,新的Circle實例的半徑為兩個操作數Cirlcle實例半徑的和,重載加法運算符如下:

可以發現,重載運算符的語法格式與函數十分相似。實際上,運算符就是通過函數的方式定義的。
提示
在某些場景下,運算符也的確可以像函數一樣來使用,例如在一個函數參數中傳入閉包時,也可以直接傳入某個功能類型的運算符,示例如下:
func myFunc(closure:(Circle,Circle)->Circle) {
}
//將重載的加法運算符傳入
myFunc(closure: +)
注意
Swift語言中還有一個覆寫的概念。覆寫是指子類對父類中的屬性和方法進行適合自身的重新實現,和重載意義完全不同,讀者在后面的學習中會遇到,注意不要將這兩個概念混淆。
6.2.2 自定義運算符
重載運算符是為已經存在的系統運算符擴展新的功能。開發者也可以通過自定義系統不存在的運算符來實現特殊的需求,例如Swift語言從2.2版本開始移除了“++”“--”運算符,這里我們可以通過自定義運算符來添加自加運算符“++”,示例如下:

自定義運算符分為兩個步驟,首先開發者需要將要定義的運算符進行聲明,如上代碼中的prefix operator ++。在聲明運算符的結構中,prefix的作用是運算符的類型,可以使用prefix關鍵字將其聲明為前綴運算符,也可以使用infix關鍵字將其聲明為中綴運算符、postfix關鍵字將其聲明為后綴運算符。在進行運算符的實現時,后綴和前綴運算符只能有一個參數,參數在func關鍵字前需要表明要實現的運算符類型,而中綴運算符需要有兩個參數且func關鍵字前不需要額外標明,示例如下:

提示
前綴運算符是指在只有一個操作數且在使用運算符進行運算時,運算符需要出現在操作數的前面;中綴運算符需要有兩個操作數,且在進行運算時運算符需要出現在兩個操作數的中間;后綴運算符只能有一個操作數,在運算時后綴運算符需要出現在操作數的后面。
需要注意,Swift語言中提供了許多Unicode字符,可用于運算符的自定義,但是也有一些規則,自定義運算符常使用如下字符作為開頭:/、=、-、+、!、*、%、<、>、&、|、^、?、~。開發者也可以使用點“.”來進行運算符的定義。當開發者的自定義運算符中有使用到符號“.”的時候需要注意:如果“.”出現在自定義運算符的開頭,則運算符中可以出現多個符號“.”,例如“.+.”;如果自定義運算符中的符號“.”不在開頭,那么這個自定義運算符中只允許出現一個符號“.”。
提示
Swift語言中也有一些保留符號,它們不可以單獨被重載和自定義。保留符號為=、->、//、/*、*/、.、<、>、&、?、!。
- UNIX編程藝術
- C程序設計簡明教程(第二版)
- Pandas Cookbook
- C++ Builder 6.0下OpenGL編程技術
- INSTANT MinGW Starter
- JavaScript+Vue+React全程實例
- 嚴密系統設計:方法、趨勢與挑戰
- SQL Server 2016數據庫應用與開發
- 小學生C++創意編程(視頻教學版)
- Mastering Android Development with Kotlin
- Python3.5從零開始學
- Getting Started with Nano Server
- BeagleBone Robotic Projects(Second Edition)
- JavaScript程序設計:基礎·PHP·XML
- Android Development Tools for Eclipse