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