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

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