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