自定義運算子
Swift 支援建立自定義運算子。使用 operator
關鍵字在全域性級別宣告新運算子。
運算子的結構由三部分定義:運算元放置,優先順序和關聯性。
-
prefix
,infix
和postfix
修飾符用於啟動自定義操作符宣告。prefix
和postfix
修飾符宣告運算子是否必須分別位於其作用的值之前或之後。這樣的運算子就像8
和3++
**一樣 ,因為它們只能作用於一個目標。infix
宣告瞭一個二元運算子,它作用於它之間的兩個值,例如2+3
。 -
首先計算優先順序較高的運算子。預設的運算子優先順序僅高於
?
…:
(Swift 2.x 中的值為 100)。可以在此處找到標準 Swift 運算子的優先順序。 -
關聯性定義了相同優先順序的運算子之間的運算順序。左關聯運算子從左到右計算(讀取順序與大多數運算子一樣),而右關聯運算子從右到左計算。
Version >= 3.0
從 Swift 3.0 開始,可以在優先級組中定義優先順序和關聯性而不是運算子本身,這樣多個運算子可以輕鬆地共享相同的優先順序而無需引用神祕數字。標準優先順序組列表如下所示 。
運算子根據計算程式碼返回值。此程式碼用作普通函式,其中引數指定輸入的型別,return
關鍵字指定運算子返回的計算值。
這是一個簡單指數運算子的定義,因為標準 Swift 沒有指數運算子。
import Foundation
infix operator ** { associativity left precedence 170 }
func ** (num: Double, power: Double) -> Double{
return pow(num, power)
}
infix
說**
運算元在兩個值之間工作,例如 9**2
。因為該函式具有左關聯性,所以 3**3**2
計算為 (3**3)**2
。170
的優先順序高於所有標準的 Swift 操作,這意味著 3+2**4
計算到 19
,儘管**
的左關聯性。
Version >= 3.0
import Foundation
infix operator **: BitwiseShiftPrecedence
func ** (num: Double, power: Double) -> Double {
return pow(num, power)
}
在 Swift 3.0 上,我們可以使用內建的優先順序組 BitwiseShiftPrecedence 來提供正確的值(與 <<
,>>
相同),而不是顯式地指定優先順序和關聯性。
**:不推薦使用遞增和遞減,將在 Swift 3 中刪除。