標(biāo)準(zhǔn)的運(yùn)算符不夠玩,那你可以聲明一些個(gè)性的運(yùn)算符,但個(gè)性的運(yùn)算符只能使用這些字符/ = - + * % < >!& | ^。~。
新的運(yùn)算符聲明需在全局域使用operator關(guān)鍵字聲明,可以聲明為前置,中置或后置的。
operator prefix +++ {}
這段代碼定義了一個(gè)新的前置運(yùn)算符叫+++,此前Swift并不存在這個(gè)運(yùn)算符。此處為了演示,我們讓+++對(duì)Vector2D對(duì)象的操作定義為 雙自增 這樣一個(gè)獨(dú)有的操作,這個(gè)操作使用了之前定義的加賦運(yùn)算實(shí)現(xiàn)了自已加上自己然后返回的運(yùn)算。
@prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D {
vector += vector
return vector
}
Vector2D 的 +++ 的實(shí)現(xiàn)和 ++ 的實(shí)現(xiàn)很接近, 唯一不同的前者是加自己, 后者是加值為 (1.0, 1.0) 的向量.
var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
let afterDoubling = +++toBeDoubled
// toBeDoubled 現(xiàn)在是 (2.0, 8.0)
// afterDoubling 現(xiàn)在也是 (2.0, 8.0)
可以為自定義的中置運(yùn)算符指定優(yōu)先級(jí)和結(jié)合性??梢曰仡^看看優(yōu)先級(jí)和結(jié)合性解釋這兩個(gè)因素是如何影響多種中置運(yùn)算符混合的表達(dá)式的計(jì)算的。
結(jié)合性(associativity)的值可取的值有left,right和none。左結(jié)合運(yùn)算符跟其他優(yōu)先級(jí)相同的左結(jié)合運(yùn)算符寫在一起時(shí),會(huì)跟左邊的操作數(shù)結(jié)合。同理,右結(jié)合運(yùn)算符會(huì)跟右邊的操作數(shù)結(jié)合。而非結(jié)合運(yùn)算符不能跟其他相同優(yōu)先級(jí)的運(yùn)算符寫在一起。
結(jié)合性(associativity)的值默認(rèn)為none,優(yōu)先級(jí)(precedence)默認(rèn)為100。
以下例子定義了一個(gè)新的中置符+-,是左結(jié)合的left,優(yōu)先級(jí)為140。
operator infix +- { associativity left precedence 140 }
func +- (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y - right.y)
}
let firstVector = Vector2D(x: 1.0, y: 2.0)
let secondVector = Vector2D(x: 3.0, y: 4.0)
let plusMinusVector = firstVector +- secondVector
// plusMinusVector 此時(shí)的值為 (4.0, -2.0)
這個(gè)運(yùn)算符把兩個(gè)向量的x相加,把向量的y相減。因?yàn)樗麑?shí)際是屬于加減運(yùn)算,所以讓它保持了和加法一樣的結(jié)合性和優(yōu)先級(jí)(left和140)。查閱完整的Swift默認(rèn)結(jié)合性和優(yōu)先級(jí)的設(shè)置,請(qǐng)移步表達(dá)式;