【Swift】Equatableプロトコルの使い方!値の比較とComparableの違い
この記事からわかること
- SwiftのEquatableの使い方
- 独自クラスを比較できるようにする方法
- Comparableとの違い
index
[open]
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.0
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
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プロトコルに準拠させると==関数の実装が必須になります。==関数の中に比較条件を自分で記述しておくことで一致しているかどうかを識別します。引数lhsとrhsから左右の値を取得できるので最終的な一致条件を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 :)などが使用できるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。







