像這樣定義乙個結構體
struct vector2d
當 vector2d 的兩個變數相加時,我們需要這樣做:
let v1 = vector2d(x: 2.0, y: 3.0)
let v2 = vector2d(x: 4.0, y: 5.0)
var v3 = vector2d(x: v1.x + v2.x, y: v1.y + v2.y)
只是一次這樣的相加還好,如果需要多次重複用到這兩個結構體的相加運算,就有必要過載一下 + 運算子。
func + (left: vector2d, right: vector2d) -> vector2d
這樣,這兩個結構體相加就變得很簡單了。
v3= v1
+v2 //
過載操作使運算變得簡單,但 swift 有規定:
等號運算子 = 和三木運算子 (a ? b : c) 不可被過載。
當標準的操作符不滿足我們的要求時,就需要自定義一些操作符。
新的操作符需要用 operator 關鍵字宣告在全域性變數中,可以用 prefix,infix,postfix 宣告
例如:現在我們定義乙個新的操作符 ⋅ 使結構體 vector2d 做向量相乘
infix operator ⋅
infix
表示要定義的是乙個中位操作符,即前後都是輸入
associativity
定義了結合律,即如果多個同類的操作符順序出現的計算順序。比如常見的加法和減法都是
left
,就是說多個加法同時出現時按照從左往右的順序計算
(因為加法滿足交換律,所以這個順序無所謂,但是減法的話計算順序就很重要了
)。點乘的結果是乙個
double
,不再會和其他點乘結合使用,所以這裡寫成
none
precedence
運算的優先順序,越高的話優先進行計算。swift 中乘法和除法的優先順序是 150 ,加法和減法的優先順序是 140 ,這裡我們定義點積的優先順序為 160 ,就是說應該早於普通的乘除進行運算。
func ⋅ (left: vector2d, right: vector2d) -> double
let value = v1
⋅v2 // 23.0
swift 自定義運算子
除了實現標準運算子,在swift當中還可以宣告和實現自定義運算子 custom operators 新的運算子要在全域性作用域內,使用operator 關鍵字進行宣告,同時還要指定prefix infix或者 postfix限定符 code a uikit based playground for ...
Swift 運算子過載和運算子函式
讓已有的運算子對自定義的類和結構進行運算或者重新定義已有運算子的運算規則,這種機制被稱為運算子過載。1,通過過載加號運算子,使自定義的兩個座標結構體物件實現相加 12 3456 78910 11structcenterpointer func left centerpointer,right cen...
swift 運算子過載
類和結構體可以位現有的運算子提供自定義的實現。成為運算子過載 code a uikit based playground for presenting user inte ce import uikit struct vector2d extension vector2d let vector ve...