【Swift】Equatableプロトコルの使い方!値の比較とComparableの違い
この記事からわかること
- SwiftのEquatableの使い方
- 独自クラスを比較できるようにする方法
- Comparableとの違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- 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 :)
などが使用できるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。