[Swift]演算子を自作する
なんらかの処理で得られた結果を、メンバ変数などに上書きする状況を考える。
つまり、結果として何らかの値が得られれば上書きをし、なければ(結果がnil
であれば)しない、というロジックなのだが、その実装は以下のように実現できるだろう。
1 2 3 |
if let result = something() { // something() returns an optional value self.member = result } |
しかしこうしたケースが多いと実装が冗長に感じてしまう。
いっそ「右辺に値があれば左辺に代入する」演算子があれば良さそうだ。
仮にその演算子を?=
とすると、上記実装は次のように簡略化できる。
1 |
self.member ?= something() |
そしてこの演算子は、以下実装で実現が可能だ。
1 2 3 4 5 6 |
infix operator ?= {} func ?= <T>(inout lhs: T, rhs: T?) { if let rhs = rhs { lhs = rhs } } |
1行目infix operator ?= {}
で演算子?=
を宣言している。
{}
は、演算子の付加情報を記述する領域であるが、今回は指定していない。
(こちらに詳細が解説されている)
infix
は、定義する演算子が値間に配置するもの、すなわち二項演算子であることを示す。
一方値に対して前置される演算子の場合はprefix
、逆に後置される演算子はpostfix
と記す。
inout
修飾子が、左辺の値が演算子の結果により書き換えられることを示している。
(メソッドのパラメタにinout
修飾子を指定した場合、パラメタとする変数名の先頭に&
を付ける必要があるが、演算子の場合は不要のようだ)
あとは内部実装をメソッドと同じ感覚で記述すれば良い。
ともあれ、演算子の自作、オーバーライドにおいては、前述通り以下のリンク先が大変参考となった。