[Swift]演算子を自作する

なんらかの処理で得られた結果を、メンバ変数などに上書きする状況を考える。

つまり、結果として何らかの値が得られれば上書きをし、なければ(結果がnilであれば)しない、というロジックなのだが、その実装は以下のように実現できるだろう。

しかしこうしたケースが多いと実装が冗長に感じてしまう。
いっそ「右辺に値があれば左辺に代入する」演算子があれば良さそうだ。

仮にその演算子を?=とすると、上記実装は次のように簡略化できる。

そしてこの演算子は、以下実装で実現が可能だ。

1行目infix operator ?= {} で演算子?=を宣言している。
{}は、演算子の付加情報を記述する領域であるが、今回は指定していない。
(こちらに詳細が解説されている)

infixは、定義する演算子が値間に配置するもの、すなわち二項演算子であることを示す。
一方値に対して前置される演算子の場合はprefix、逆に後置される演算子はpostfixと記す。

inout修飾子が、左辺の値が演算子の結果により書き換えられることを示している。
(メソッドのパラメタにinout修飾子を指定した場合、パラメタとする変数名の先頭に&を付ける必要があるが、演算子の場合は不要のようだ)

あとは内部実装をメソッドと同じ感覚で記述すれば良い。


ともあれ、演算子の自作、オーバーライドにおいては、前述通り以下のリンク先が大変参考となった。

演算子のオーバーロード | Swift言語を学ぶ

コメントを残す