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