0Pricing
Swift Academy · Lektion

Benutzerdefinierte Gleichheitssemantik

Implementieren Sie fachlich korrekte Gleichheitsregeln.

Benutzerdefinierte Gleichheitssemantik ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Wenn das Standard-== nicht stimmt

Das synthetisierte == vergleicht jede gespeicherte Eigenschaft. Manchmal ist das zu streng (Sie interessieren sich nur für eine ID) oder zu wenig streng. Dann schreiben Sie == selbst.

Identitätsbasierte Gleichheit

Behandeln Sie zwei Datensätze als gleich, wenn ihre IDs übereinstimmen, und ignorieren Sie die übrigen Felder:

struct Account: Equatable {
    let id: Int
    var balance: Int
    static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 1, balance: 10) == Account(id: 1, balance: 999))  // true

Gleichheit ohne Beachtung der Groß-/Kleinschreibung

Normalisieren Sie die Werte vor dem Vergleich:

struct Username: Equatable {
    let raw: String
    static func == (l: Username, r: Username) -> Bool {
        l.raw.lowercased() == r.raw.lowercased()
    }
}
print(Username(raw: "Ann") == Username(raw: "ANN"))  // true

Hashable konsistent halten

Wenn Sie == anpassen, MÜSSEN Sie hash(into:) so aktualisieren, dass dieselben Felder verwendet werden. Andernfalls können gleiche Werte unterschiedlich gehasht werden, wodurch Sets fehlerhaft funktionieren.

Abgestimmtes == und hash(into:)

Beide verwenden nur id und bleiben dadurch konsistent:

struct User: Hashable {
    let id: Int
    var name: String
    static func == (l: User, r: User) -> Bool { l.id == r.id }
    func hash(into h: inout Hasher) { h.combine(id) }
}
print(Set([User(id: 1, name: "A"), User(id: 1, name: "B")]).count)  // 1

Gleichheit ohne Berücksichtigung eines Caches

Schließen Sie abgeleitete oder zwischengespeicherte Felder aus dem Vergleich aus:

struct Doc: Equatable {
    let text: String
    var cachedWordCount: Int
    static func == (l: Doc, r: Doc) -> Bool { l.text == r.text }
}
let a = Doc(text: "hi", cachedWordCount: 1)
let b = Doc(text: "hi", cachedWordCount: 999)
print(a == b)  // true

Toleranter Gleitkomma-Vergleich

Vergleichen Sie Double-Werte innerhalb eines Epsilon statt exakt:

struct Measure: Equatable {
    let value: Double
    static func == (l: Measure, r: Measure) -> Bool {
        abs(l.value - r.value) < 0.0001
    }
}
print(Measure(value: 0.1 + 0.2) == Measure(value: 0.3))  // true

Gleichheit anhand einer Teilmenge von Feldern

Vergleichen Sie für die fachliche Gleichheit eine aussagekräftige Teilmenge:

struct Card: Equatable {
    let rank: Int
    let suit: String
    let isFaceUp: Bool   // display state, not identity
    static func == (l: Card, r: Card) -> Bool {
        l.rank == r.rank && l.suit == r.suit
    }
}
print(Card(rank: 1, suit: "H", isFaceUp: true) == Card(rank: 1, suit: "H", isFaceUp: false))  // true

Die Equatable-Gesetze einhalten

Ein eigenes == muss reflexiv (a == a), symmetrisch (aus a == b folgt b == a) und transitiv bleiben. Verstöße führen bei Collections und Algorithmen zu unklaren Ergebnissen.

Eine symmetrische Implementierung

Der Vergleich normalisierter Formen erhält die Symmetrie:

struct Email: Equatable {
    let address: String
    static func == (l: Email, r: Email) -> Bool {
        l.address.lowercased() == r.address.lowercased()
    }
}
let x = Email(address: "A@x.com")
let y = Email(address: "a@X.com")
print(x == y, y == x)  // true true

Eigene Gleichheit in einem Set

Da die Gleichheit und das Hashing nur nach der ID übereinstimmen, behandelt das Set Werte mit derselben ID als einen einzigen Wert:

struct Item: Hashable {
    let id: Int
    var note: String
    static func == (l: Item, r: Item) -> Bool { l.id == r.id }
    func hash(into h: inout Hasher) { h.combine(id) }
}
let s: Set<Item> = [Item(id: 1, note: "x"), Item(id: 1, note: "y")]
print(s.count)  // 1

Schnelltest

Was müssen Sie zusätzlich tun, nachdem Sie ein eigenes == geschrieben haben, das nur einige Felder verwendet?

Zusammenfassung

Sie haben eigene Gleichheit kennengelernt:

  • Schreiben Sie Ihr eigenes ==, wenn der standardmäßige Vergleich der gesamten Struktur nicht passt
  • Häufige Fälle: nur ID, ohne Beachtung der Groß-/Kleinschreibung, Gleitkommawerte mit Epsilon, Caches ignorieren
  • Halten Sie hash(into:) mit denselben Feldern konsistent
  • Bleiben Sie reflexiv, symmetrisch und transitiv

Kurs abgeschlossen! Als Nächstes: CustomStringConvertible und Mirror.

Häufig gestellte Fragen

Ist die Lektion „Benutzerdefinierte Gleichheitssemantik“ kostenlos?

Ja — der vollständige Text von „Benutzerdefinierte Gleichheitssemantik“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Benutzerdefinierte Gleichheitssemantik“?

Implementieren Sie fachlich korrekte Gleichheitsregeln. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Benutzerdefinierte Gleichheitssemantik“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Synthetisiertes Equatable
  2. Hashable und hash(into:)
  3. Comparable und Sortierung
  4. Benutzerdefinierte Gleichheitssemantik
← Zurück zu Swift Academy