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プロトコルに準拠している列挙型
●連想値を持たない列挙型…

Swift プロトコル、プロトコルのプロパティ

プロトコルにプロパティを定義する

protocol プロトコル名{
    var プロパティ名 : 型名{get} //ゲッターのみ必要
}

protocol プロトコル名{
    var プロパティ名 : 型名{get set}  //ゲッターとセッターが必要
}

プロトコルにプロパティを定義する場合上記のようにプロパティ名・型名・ゲッターとセッターの有無を定義します。

プロパティは常にvarキーワードで宣言します。


(プロパティの実装を要求する)プロトコルに準拠する

プロトコルは、準拠する型(sample1では構造体)に対して実装を要求します。

準拠する型が、プロトコルが要求するプロパティを実装する方法、つまりプロトコルに準拠する方法が以下です。

sample1

protocol ProtocolA{
    var prop:Int{get}
}

struct StructA:ProtocolA{
    var prop:Int  //←変数のストアドプロパティ
}

struct StructB:ProtocolA{
    let prop:Int  //←定数のストアドプロパティ

Swift プロトコル、パート1

プロトコルの基本

プロトコルの定義方法

構造体・クラス・列挙型などの型がプロトコルAに準拠するとプロトコルAの持つ機能・特性を準拠した型も持つことができます。

プロトコルAに準拠する方法

複数のプロトコルに準拠した型を定義する場合は上記のように,(カンマ)で区切って記述します。

上記のように記述したうえで、準拠するプロトコルが要求するプロパティ・メソッドなどを型の中で実装すれば、プロトコルに準拠した型を定義できます。

sample1

protocol ProtocolA{
    func methA()
}

struct StructA:ProtocolA{
    func methA(){
        
    }
}

sample1ではProtocolAという名のプロトコルを定義し、次にProtocolAに準拠した構造体StructAを定義しています。

ProtocolAは、準拠する型(StructA)に、メソッドmethA()の実装を要求していますので、StructAの定義内でメソッドmethA()を定義する必要があります。

プロトコルが要求するプロパティ・メソッドを準拠する型内で定義していないとコンパイルエラーとなります。(sample2)

sample2

protocol ProtocolA{
    func methA()
    func methB()
}

struct StructA:ProtocolA{
    func methA(){
        
    }
}
main.swift:7:8: error: type 'StructA' does