Swift が提供する標準の演算子に加え、独自の演算子を宣言して実装することができます。カスタム演算子を定義するために使用できる文字のリストは、Operators を確認してください。

新しい演算子はグローバルレベルに operator キーワードを使用して宣言され、prefixinfix あるいは 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 が取り得る値は、leftright および 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 を確認してください。

NOTE
前置演算子または後置演算子を定義するときには、優先順位を指定しません。前置演算子および後置演算子の両方に同じオペランド(被演算子)を適用した場合、後置演算子が先に適用されます。

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.