1.基本
sample1
struct Container { var x:Int=0 var y:Int=0 var z:Int=0 } extension Container : Equatable{ static func ==(left:Container,right:Container)->Bool{ return (left.x==right.x)&&(left.y==right.y)&&(left.z==right.z) } } var con1=Container(x:1,y:1,z:1) var con2=Container(x:4,y:4,z:4) print(con1==con2) con2.x=1 con2.y=1 con2.z=1 print(con1==con2)
false
true
独自の型(sample1ではContainer型)に==演算子を使いたい場合、Equatableプロトコルに準拠する必要があります。そのための記述が7~11行目。extensionキーワードを用いてEquatableプロトコルへの準拠を宣言しています。
2.簡易的な実装
sample1の形が基本ですが、以下のいくつかのシンプルなケース
●すべてのストアドプロパティがEquatableプロトコルに準拠している構造体
●すべての連想値がEquatableプロトコルに準拠している列挙型
●連想値を持たない列挙型
上記のケースでは-=演算子の実装を記述せず、Equatableプロトコルへの準拠を宣言するだけで、独自の型に対して==演算子を使えるようになります。
sample2-1
struct Container { var x:Int=0 var y:Int=0 var z:Int=0 } extension Container : Equatable{} var con1=Container(x:3,y:2,z:2) var con2=Container(x:1,y:1,z:1) print(con1==con2) con2.x=2 con2.y=2 con2.z=2 print(con1==con2)
false
false
型の定義部分でEquatableプロトコルへの準拠を宣言しているのがsample2-2
sample2-2
struct Container : Equatable{ var x:Int=0 var y:Int=0 var z:Int=0 } var con1=Container(x:2,y:2,z:2) var con2=Container(x:1,y:1,z:1) print(con1==con2) con2.x=2 con2.y=2 con2.z=2 print(con1==con2)
false
true
どちらでも同じです。