web-dev-qa-db-ja.com

swiftで代入演算子をオーバーロードする方法

次のように、CGFloatの「=」演算子をオーバーライドしたいと思います。

func = (inout left: CGFloat, right: Float) {
    left=CGFloat(right)
}

だから私は次のことをすることができました:

var A:CGFloat=1
var B:Float=2
A=B

これはできますか?エラーExplicitly discard the result of the closure by assigning to '_'

25
mcfly soft

ドキュメント で概説されているように、それは不可能です:

デフォルトの代入演算子(=)をオーバーロードすることはできません。複合割り当て演算子のみをオーバーロードできます。同様に、3項条件演算子(a?b:c)はオーバーロードできません。

それでも納得できない場合は、演算子を+=に変更してください。

func +=(left: inout CGFloat, right: Float) {
    left += CGFloat(right)
}

コンパイルエラーが発生しなくなります。

誤解を招くエラーメッセージが表示されるのは、おそらくコンパイラがオーバーロードの試みを割り当てとして解釈しているためです。

32
Antonio

割り当てをオーバーライドすることはできませんが、場合によっては別の演算子を使用できます。例えば ​​&=演算子。

func &= (inout left: CGFloat, right: Float) {
    left = CGFloat(right)
}

したがって、次のことができます。

var A: CGFLoat = 1
var B: Float = 2
A &= B

ちなみに演算子&+&-&* Swiftに存在します。これらは、オーバーフローのないCスタイルの操作を表します。 その他

11
fnc12