Swift が提供する標準の演算子に加え、独自の演算子を宣言して実装することができます。カスタム演算子を定義するために使用できる文字のリストは、Operators を確認してください。
新しい演算子はグローバルレベルに operator
キーワードを使用して宣言され、prefix
、infix
あるいは postfix
が付けられます。
prefix operator +++ {}
この例では、新しい前置演算子 +++
を定義しています。Swift ではこの演算子に既存の意味は無く、Vector2D
インスタンスを扱う特定のコンテキストにおいての独自の意味が以下で与えられます。この例の目的は、+++
を新しい「前置二重加算子」として扱うことです。定義済みの加算代入演算子で Vector2D
インスタンスにそのインスタンス自体を加えて、x
値と y
値を 2 倍します。
prefix func +++ (inout vector: Vector2D) -> Vector2D {
vector += vector
return vector
}
この +++
の実装は、Vector2D(1.0, 1.0)
を加えるのではなく、この演算子がベクトルにそれ自体を加えるということを除いて、Vector2D
の ++
の実装にとてもよく似ています。
var toBeDoubled = Vector2D(x: 1.0, y: 4.0)
let afterDoubling = +++toBeDoubled
// toBeDoubled の値は (2.0, 8.0)
// afterDoubling の値も (2.0, 8.0)
中置演算子の優先順位と結合性
infix
演算子にも優先順位と結合性を指定することができます。2 つの特性が、中置演算子と別の中置演算子にどのように影響するかの説明については、Precedence and Associativity を確認してください。
associativity
が取り得る値は、left
、right
および none
です。左結合演算子が、同じ優先順位の別の左結合演算子の次に記述された場合、左に結合します。同様に、右結合演算子が、同じ優先順位の別の右結合演算子の次に記述された場合、右に結合します。非結合演算子を、同じ優先順位の別の演算子の次に記述することはできません。
associativity
値のデフォルトは、指定が無ければ none
になります。precedence
値のデフォルトは、指定が無ければ 100
になります。
次の例では、結合性 left
、優先順位 140
の新しい infix
演算子 +-
を定義しています。
infix operator +- { 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 は Vector2D インスタンスで、値は (4.0, -2.0)
この演算子は、2 つのベクトルの x
値を足し合わせ、1 つ目から 2 つ目のベクトルの y
値を差し引きます。本質的には「加減式の」演算子であるため、+
や -
のような加減式の中置演算子のデフォルトと同じ結合性と優先順位の値(left
と 140
)が与えられています。Swift 標準ライブラリで提供される演算子の優先順位と結合性の設定についての完全なリストは、Swift Standard Library Operators Reference を確認してください。
Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.