Hashable/Equatable/Comparableの自動導出
単純な構造体や列挙型では、SwiftにEquatable/Hashable(およびCodable)を synthesize させます。必要に応じてカスタム Comparable (辞書順)や手動の hash(into:) を実装します。
「Hashable/Equatable/Comparableの自動導出」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。
何が自動合成されるか
Swiftでは、単純な型に対して一般的な適合を自動合成できます。
- Equatable: 値の等価性
- Hashable: 辞書や集合のキー
- Codable: エンコード/デコード
Comparableは自分で(辞書順に)実装するか、該当する場合は列挙型のケースの順序に頼ることができます。
構造体での自動合成
格納プロパティがEquatable/Hashableに適合する構造体では、Swiftが両方を自動的に生成します。
struct Point: Equatable, Hashable {
var x: Int
var y: Int
// No extra code: Equatable & Hashable are synthesized
}
let p1 = Point(x: 1, y: 2)
let p2 = Point(x: 1, y: 2)
print(p1 == p2) // true
let set: Set<Point> = [p1, p2] // Hashable works; duplicates coalesce
print(set.count) // 1列挙型でのComparable
関連値を持たない列挙型では、ケースの順序に基づいてComparableの適合を自動合成できます。
enum Priority: Comparable { case low, medium, high }
// Comparable is synthesized using case order: low < medium < high
print(Priority.low < .high) // true構造体でのComparable
構造体では<を手動で記述します。単純な辞書順の比較(最後の要素、次に最初の要素)が一般的です。
struct Person: Comparable, Hashable {
let last: String
let first: String
static func < (lhs: Person, rhs: Person) -> Bool {
if lhs.last != rhs.last { return lhs.last < rhs.last }
return lhs.first < rhs.first
}
}
let a = Person(last: "Doe", first: "Ana")
let b = Person(last: "Doe", first: "Max")
print(a < b) // true (Ana before Max)独自の等価性とハッシュ
等価性やハッシュで書式(大文字と小文字、空白など)を無視する場合は、==とhash(into:)を記述します。
struct FileID: Hashable, Equatable {
let path: String
// Normalize case/trim when hashing & comparing
static func == (l: FileID, r: FileID) -> Bool {
l.path.lowercased().trimmingCharacters(in: .whitespaces) ==
r.path.lowercased().trimmingCharacters(in: .whitespaces)
}
func hash(into hasher: inout Hasher) {
hasher.combine(path.lowercased().trimmingCharacters(in: .whitespaces))
}
}
let f1 = FileID(path: " Readme.md ")
let f2 = FileID(path: "readme.md")
print(f1 == f2) // true
print(Set([f1, f2]).count) // 1ベストプラクティス
ヒント:
- ==とhash(into:)の一貫性を保ってください。等しい値は同じハッシュ値になる必要があります。
- まずは自動合成を優先し、独自の意味が必要な場合にのみ手動で実装してください。
- Comparableの順序付けのルールをドキュメント化してください。
- 単純な順序付きの尺度が適している場合は、ペイロードを持たない列挙型を使用してください。
自動合成のチェックリスト
確認問題: 単純な構造体や列挙型に対して、Swiftが自動的に合成できるものは何ですか?
まとめ
まとめ: 単純なモデルでは、SwiftにEquatable/Hashable(およびCodable)を自動合成させてください。Comparableは明確な辞書順のルールで実装するか、可能な場合は列挙型のケースの順序を利用します。
よくある質問
「Hashable/Equatable/Comparableの自動導出」レッスンは無料ですか?
はい。「Hashable/Equatable/Comparableの自動導出」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。
「Hashable/Equatable/Comparableの自動導出」で何を学びますか?
単純な構造体や列挙型では、SwiftにEquatable/Hashable(およびCodable)を synthesize させます。必要に応じてカスタム Comparable (辞書順)や手動の hash(into:) を実装します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「Hashable/Equatable/Comparableの自動導出」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 演算子オーバーロードと優先順位グループ
- サブスクリプトとカスタムインデックス再入門
- Hashable/Equatable/Comparableの自動導出