讓已有的運算符也可以對自定義的類和結(jié)構進行運算,這稱為運算符重載。
這個例子展示了如何用+讓一個自定義的結(jié)構做加法。算術運算符+是一個兩目運算符,因為它有兩個操作數(shù),而且它必須出現(xiàn)在兩個操作數(shù)之間。
例子中定義了一個名為Vector2D的二維坐標向量 (x,y) 的結(jié)構,然后定義了讓兩個Vector2D的對象相加的運算符函數(shù)。
struct Vector2D {
var x = 0.0, y = 0.0
}
@infix func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
該運算符函數(shù)定義了一個全局的+函數(shù),這個函數(shù)需要兩個Vector2D類型的參數(shù),返回值也是Vector2D類型。需要定義和實現(xiàn)一個中置運算的時候,在關鍵字func之前寫上屬性 @infix 就可以了。
在這個代碼實現(xiàn)中,參數(shù)被命名為了left和right,代表+左邊和右邊的兩個Vector2D對象。函數(shù)返回了一個新的Vector2D的對象,這個對象的x和y分別等于兩個參數(shù)對象的x和y的和。
這個函數(shù)是全局的,而不是Vector2D結(jié)構的成員方法,所以任意兩個Vector2D對象都可以使用這個中置運算符。
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
// combinedVector 是一個新的Vector2D, 值為 (5.0, 5.0)
這個例子實現(xiàn)兩個向量 (3.0,1.0) 和 (2.0,4.0) 相加,得到向量 (5.0,5.0) 的過程。如下圖示:

上個例子演示了一個雙目中置運算符的自定義實現(xiàn),同樣我們也可以玩標準單目運算符的實現(xiàn)。單目運算符只有一個操作數(shù),在操作數(shù)之前就是前置的,如-a; 在操作數(shù)之后就是后置的,如i++。
實現(xiàn)一個前置或后置運算符時,在定義該運算符的時候于關鍵字func之前標注 @prefix 或 @postfix 屬性。
@prefix func - (vector: Vector2D) -> Vector2D {
return Vector2D(x: -vector.x, y: -vector.y)
}
這段代碼為Vector2D類型提供了單目減運算-a,@prefix屬性表明這是個前置運算符。
對于數(shù)值,單目減運算符可以把正數(shù)變負數(shù),把負數(shù)變正數(shù)。對于Vector2D,單目減運算將其x和y都進進行單目減運算。
let positive = Vector2D(x: 3.0, y: 4.0)
let negative = -positive
// negative 為 (-3.0, -4.0)
let alsoPositive = -negative
// alsoPositive 為 (3.0, 4.0)
組合賦值是其他運算符和賦值運算符一起執(zhí)行的運算。如+=把加運算和賦值運算組合成一個操作。實現(xiàn)一個組合賦值符號需要使用@assignment屬性,還需要把運算符的左參數(shù)設置成inout,因為這個參數(shù)會在運算符函數(shù)內(nèi)直接修改它的值。
@assignment func += (inout left: Vector2D, right: Vector2D) {
left = left + right
}
因為加法運算在之前定義過了,這里無需重新定義。所以,加賦運算符函數(shù)使用已經(jīng)存在的高級加法運算符函數(shù)來執(zhí)行左值加右值的運算。
上一篇:Swift優(yōu)先級和結(jié)合性下一篇:Swift 可選鏈