Swift Equatableプロトコルに準拠する

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

どちらでも同じです。

 

コメントを残す

メールアドレスが公開されることはありません。