0Pricing
Swift Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 演算子オーバーロードと優先順位グループ
  2. サブスクリプトとカスタムインデックス再入門
  3. Hashable/Equatable/Comparableの自動導出
← Swift Academyに戻る