SwiftのEquatable・Hashable・Codable適合パターンと落とし穴を徹底解説!初心者でも安心
生徒
「先生、SwiftでEquatableとかHashableとかCodableってよく出てきますけど、何をするものなんですか?」
先生
「それはとても大切な仕組みです。簡単に言うと、Equatableは『等しいかどうか比べられる』、Hashableは『ハッシュ化できる』、Codableは『データを保存や読み込みできる』ようにするためのルールなんですよ。」
生徒
「なるほど!でも、なんだか難しそうですね…」
先生
「心配しなくて大丈夫です。身近な例えとサンプルコードでわかりやすく説明しますから、一緒に見ていきましょう。」
1. Equatableとは?
Equatableは「二つの値が同じかどうかを比較できるようにする」ためのプロトコルです。例えば、学生の名前が同じかどうか比べたいときに使います。自動的に実装される場合もありますが、カスタム型では自分で定義することもあります。
struct Student: Equatable {
var id: Int
var name: String
}
let a = Student(id: 1, name: "Taro")
let b = Student(id: 1, name: "Taro")
print(a == b) // true
true
ここでは同じidとnameを持つので、二つのインスタンスはtrueと判定されます。
2. Hashableとは?
Hashableは、値を一意に識別できる「ハッシュ値」を持たせるためのプロトコルです。これは主にSetやDictionaryで使われます。例えば、学生のリストから重複をなくすときに便利です。
struct Student: Hashable {
var id: Int
var name: String
}
let students: Set = [
Student(id: 1, name: "Taro"),
Student(id: 2, name: "Hanako"),
Student(id: 1, name: "Taro") // 重複
]
print(students.count) // 2
2
重複する値は自動的に排除され、ユニークな要素だけが残ります。
3. Codableとは?
Codableは、データをJSONやファイルに保存したり、逆に読み込んだりできる仕組みです。例えば、アプリでユーザー情報を保存する場合に活用します。
import Foundation
struct Student: Codable {
var id: Int
var name: String
}
let student = Student(id: 1, name: "Taro")
let encoder = JSONEncoder()
if let data = try? encoder.encode(student) {
print(String(data: data, encoding: .utf8)!)
}
{"id":1,"name":"Taro"}
このように、簡単に構造体をJSON文字列に変換できます。
4. 自動合成と落とし穴
SwiftではEquatableやHashable、Codableは多くの場合自動的に実装されます。しかし、条件によっては自分で定義が必要になることがあります。
- 計算プロパティ(
var age: Int { ... }など)は自動合成に含まれません。 - 循環参照がある場合、
Codableの自動生成はエラーになります。 - 一部のプロパティだけを比較や保存対象にしたい場合は、カスタム実装が必要です。
5. カスタム実装の例
例えば、Equatableで名前だけを比較したい場合は、自分で==演算子を定義します。
struct Student: Equatable {
var id: Int
var name: String
static func ==(lhs: Student, rhs: Student) -> Bool {
return lhs.name == rhs.name
}
}
let x = Student(id: 1, name: "Taro")
let y = Student(id: 2, name: "Taro")
print(x == y) // true
true
この場合、IDが違っても名前が同じならtrueになります。自動合成では実現できない柔軟な判定が可能です。
6. 初心者が注意すべきポイント
プログラミングを始めたばかりの人がよくつまずくのは、「自動でやってくれるはずなのにエラーになる」という場面です。例えば、プロパティの中に別の非対応型(EquatableやCodableに適合していない型)があると、自動実装は使えません。その場合は、手動で実装する必要があります。
また、Hashableを使うときは、ユニークさを保証するための情報(IDなど)をきちんと持たせることが大切です。そうしないと意図せず重複判定されることがあります。