除了實現標準運算子,在swift當中還可以宣告和實現自定義運算子(custom operators)
新的運算子要在全域性作用域內,使用operator 關鍵字進行宣告,同時還要指定prefix 、infix或者 postfix限定符
code
//: a uikit based playground for presenting user inte***ce
import uikit
struct vector2d
prefix operator +++
extension vector2d
static prefix func +++ (vector:inout vector2d)->vector2d
}var tobedoubled = vector2d(x:3.0,y: 1.0)
let afterdoubling = +++tobedoubled
print(afterdoubling.x)
print(afterdoubling.y)
結果
6 2
自定義運算子的優先順序和結合性
自定義中綴(infix)運算子也可以指定優先順序和結合性
每乙個自定義的中綴運算子都屬於乙個優先順序組
優先順序組置頂了一自定義中綴運算子和其他中綴運算子的關係
基本**時這樣的
precedencegroup myprecedence
那誰看誰懵逼啊 我們先回顧前面部落格的知識
正常的優先順序大家想必九年義務教育都懂一點 加減第二 乘除第一
//: a uikit based playground for presenting user inte***ce
import uikit
struct vector2d
precedencegroup myprecedence
infix operator +-:additionprecedence
infix operator *^:multiplicationprecedence
extension vector2d
static func *^ (left: vector2d,right:vector2d) ->vector2d
}let firstvector = vector2d(x: 1.0, y: 2.0)
let secondvector = vector2d(x: 3.0, y: 7.0)
let plusminusvecotr = firstvector +- secondvector
let thirdvector = vector2d(x: 2.0, y: 2.0)
let vector = firstvector +- secondvector *^ thirdvector
print(vector.x)
print(vector.y)
結果 7 -51 也就是先算乘除 後算加減
然後我們修改下下*^的優先順序為我們自定義的優先順序
//: a uikit based playground for presenting user inte***ce
import uikit
struct vector2d
precedencegroup myprecedence
infix operator +-:additionprecedence
infix operator *^:myprecedence
extension vector2d
static func *^ (left: vector2d,right:vector2d) ->vector2d
}let firstvector = vector2d(x: 1.0, y: 2.0)
let secondvector = vector2d(x: 3.0, y: 7.0)
let plusminusvecotr = firstvector +- secondvector
let thirdvector = vector2d(x: 2.0, y: 2.0)
let vector = firstvector +- secondvector *^ thirdvector
print(vector.x)
print(vector.y)
結果就是
先算+- 再算乘除
結果就是
8 29
swift 過載和自定義運算子
像這樣定義乙個結構體 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...
6 1 2 自定義運算子
6.1.2 自定義運算子 定義自定義的運算子的方式類似於函式,使用 let 繫結。它們可以使用任何字元,可以是通常的 f 數 算符 或者是邏輯運算子 還可以是其他字元 宣告乙個運算子,要把它的名字括在括號中,這是與通常的 let 繫結的唯一區別。使用星號時要小心,因為,用於 f 多行注釋的開始。在這...
6 1 2 自定義運算子
6.1.2 自定義運算子 定義自定義的運算子的方式類似於函式,使用 let 繫結。它們可以使用任何字元,可以是通常的 f 數 算符 或者是邏輯運算子 還可以是其他字元 宣告乙個運算子,要把它的名字括在括號中,這是與通常的 let 繫結的唯一區別。使用星號時要小心,因為,用於 f 多行注釋的開始。在這...