Swiftのオペレーター関数は、標準的なオペレーター(+、-、*、==、<など)を実装またはオーバーライドする機能、ならびに独自のオペレーター(例えば、%%や<|>など)を作成することができます。このためには、関数の宣言にキーワードoperatorを使用します。一般的に、独自の型に対してオペレーターをオーバーロードして、構文を便利で直感的にします。
Vector2D構造体の加算オーバーロードの例:
struct Vector2D { var x: Double var y: Double } func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } let v1 = Vector2D(x: 1, y: 2) let v2 = Vector2D(x: 3, y: 4) let sum = v1 + v2 // Vector2D(x: 4, y: 6)
制限事項:
+*-/&|^%~!=<>.?)のみを使用できます。標準型に対してオペレーターをオーバーロードして、例えばIntに対する+の意味を変更できますか?
回答: いいえ、Swiftでは標準型に対するグローバルなオペレーターの挙動をオーバーライドすることはできず、独自の型または特定の組み合わせに対してのみ拡張できます。例えば:
// エラー:Intに対するオーバーロードは既存の意味を変更しません+ func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // 機能しません:既存の動作と衝突します }
ストーリー
プロジェクトで独自のオペレーター**(指数)を作成しましたが、不注意から優先順位が間違って設定され、2 + 3 ** 2のような式の計算にエラーを引き起こしました。結果:不正確な結果で、デバッグが困難なバグ。
ストーリー
内部APIのモジュールで独自の型に対して==をオーバーロードしましたが、ハッシュ化(Hashable)を実装しなかったため、SetやDictionaryなどのコレクションで論理的な等価性に基づいて異なると見なされました。
ストーリー
独自のオペレーターを作成する際に、ユーザーはその意味を文書化するのを忘れました。新しい開発者はオペレーターのセマンティクスを誤解し、不適切なデータに適用した結果、ビジネスロジックにおいて難解な論理エラーが発生しました。