【Swift】Equatableプロトコルの使い方!値の比較とComparableの違い

この記事からわかること

  • SwiftEquatable使い方
  • 独自クラス比較できるようにする方法
  • Comparableとの違い

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Equatableプロトコルとは?

SwiftのEquatableプロトコルはクラスや構造体を比較できるようにする機能を持たせる役割を持つプロトコルです。独自に定義したクラスや構造体は==演算子などで比較しても期待通りに動作しません。

例えば構造体をインスタンス化した変数を2つ用意し、両者の値が同じかどうか識別しようとしてみます。

var ios = Language(name: "Swift", version: 5)
var sns = Language(name: "php", version: 8)

if ios == sns {
    print("同じ言語を使用します")
}

ですが上記のコードでは下記のような「'=='演算子に対応していないオペランドだよ」といったエラーが発生してしまいます。

Binary operator '==' cannot be applied to two 'Language' operands

これを解決するのがEquatableプロトコルです。定義元の構造体をEquatableプロトコルに準拠させることで比較可能になりエラーが発生しなくなります

struct Language: Equatable {
    var name:String
    var version:Int
}

実装方法

Equatableプロトコルに準拠させると==関数の実装が必須になります。==関数の中に比較条件を自分で記述しておくことで一致しているかどうかを識別します。引数lhsrhsから左右の値を取得できるので最終的な一致条件をBoolで返します。

struct Person: Equatable {
    let id: Int
    let name: String

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

let person1 = Person(id: 1, name: "まひろ")
let person2 = Person(id: 1, name: "まひろ")
let person3 = Person(id: 2, name: "かわもと")

print(person1 == person2) // true
print(person1 == person3) // false

大小を比較する:Comparable

クラスや構造体の大小を比較できるようにするためにはComparableプロトコルを使用します。Comparableプロトコル自体がEquatableを継承しているため==関数を必須になります。

Comparableでは < 関数を実装します。

struct Person: Comparable {
    let id: Int
    let name: String

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }

    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.id < rhs.id
    }
}

let person1 = Person(id: 1, name: "まひろ")
let person2 = Person(id: 2, name: "かわもと")

print(person1 < person2) // true
print(person1 > person2) // false

ちなみにEquatableに準拠させることでfirstIndex(of :)などが使用できるようになります。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index