Swiftで比較演算子をオーバーロードする方法(==, equals相当)

Swiftの==演算子はオブジェクトの参照比較を行うものではなく、値比較を行うための演算子であり、Javaで言う所のequalsメソッドに相当します。

==演算子の実装例は以下の通りです。

class Foo { var v = 0 }
// 実装(演算子オーバーロード)
func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.v == rhs.v }

// 実行例
Foo() == Foo(); // true
Foo() != Foo(); // error: binary operator '!=' cannot be applied to two 'Foo' operands

Equatableプロトコル

上記サンプルでは!=の比較がエラーになりますが、Equatableに準拠することで対処出来ます。またこれによりOptional同士の比較にも対応出来るようになります。

class Foo : Equatable { var v = 0 }
func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.v == rhs.v }

// 実行例
Foo() != Foo() // false

let foo:Foo? = Foo()
let bar:Foo? = Foo()
foo == bar // true

ちなみにObjective-Cベースのクラス(例えばNSObjectを継承したクラス)に関しては Objective-Cと同様==演算子は値比較ではなく参照の比較(ポインタ比較/アドレス比較)になります。

class Foo : NSObject {}
let foo = Foo()
let bar = foo
foo == bar   // true
foo == Foo() // false

広告