演算子のオーバーロードは、ユーザー定義型に対して標準(および独自の)演算子の動作を定義または再定義する機能です。これにより、構造体やクラスとの操作をより表現力豊かに記述できます。
特徴:
static funcキーワードと必須のoperator修飾子を使用して定義されます。Equatable、Comparableなど)に従う必要があります。infix、prefix、postfix)を作成できます。例:
struct Vector2D { var x: Double var y: Double static func +(lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } } let a = Vector2D(x: 1, y: 2) let b = Vector2D(x: 3, y: 4) let sum = a + b // Vector2D(x: 4, y: 6)
注意点:
ExpressibleByBooleanLiteral、BooleanType)を遵守する必要があります。precedence group)を指定する必要があります。標準演算子(例えば +)をクラスのオブジェクトで使用するためにオーバーロードすることはできますか?また、自分の構造体を==で比較するためには何が必要ですか?
回答: はい、標準の演算子(例:+、==、<)はユーザー定義の構造体およびクラスに対してオーバーロードできます。構造体/クラスを==で比較するためには、その型がEquatableプロトコルに準拠し、静的関数equalityを実装する必要があります。
例:
struct Point: Equatable { let x: Int let y: Int static func ==(lhs: Point, rhs: Point) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } }
物語
構造体の演算子==をオーバーロードしましたが、hash(into:)を実装しなかったため、この型をSetや辞書のキーとして使用しました。その結果、同じ要素がセットに二重に入ったり、見つからなかったりし、標準のHashableメカニズムが破損しました。
物語
precedence groupを指定せずに独自のinfix演算子を作成しました。そのため、演算子が論理的でない結合則で働き、複雑な式でエラーが発生しました。
物語
プロジェクトでモデルのマージのために演算子|を導入しましたが、新人はこれをビット演算ORと混同することが多く、混乱が生じてブールフラグの軽いチェックでデータの誤処理が発生しました。