Swift Academy · leksjon

Egendefinert likhetssemantikk

Implementer likhetsregler som er riktige for domenet.

Leksjon 4 av 413 trinn

Egendefinert likhetssemantikk er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Når standardverdien for == er feil

Syntetisert == sammenligner hver lagrede egenskap. Noen ganger er det for strengt (du bryr deg bare om en id) eller for løst. Da skriver du == selv.

Identitetsbasert likhet

Behandle to poster som like når id-ene deres samsvarer, og ignorer andre felt:

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

Likhet uten hensyn til store og små bokstaver

Normaliser før du sammenligner:

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

Hold Hashable konsekvent

Hvis du tilpasser ==, MÅ du oppdatere hash(into:) slik at den bruker de samme feltene. Ellers kan like verdier få ulike hashverdier og ødelegge Set:

Samsvar mellom == og hash(into:)

Begge bruker bare id, slik at de forblir konsekvente:

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

Likhet som ignorerer en hurtigbuffer

Utelat avledede eller hurtigbufrede felt fra sammenligningen:

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

Tolerant likhet for flyttall

Sammenlign double-verdier innenfor en epsilon i stedet for å kreve nøyaktig likhet:

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

Likhet basert på et delsett av feltene

Sammenlign et meningsfullt delsett for likhet i domenet:

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

Følg Equatable-reglene

Egendefinert == må være refleksiv (a == a), symmetrisk (a == b innebærer b == a) og transitiv. Brudd på disse reglene skaper forvirring i samlinger og algoritmer.

En symmetrisk implementasjon

Ved å sammenligne normaliserte former bevarer du symmetrien:

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

Egendefinert likhet i et Set

Fordi likhet og hashing som bare bruker id, er konsekvente, behandler Set verdier med samme id som én verdi:

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

Hurtigsjekk

Hva må du også gjøre etter at du har skrevet en egendefinert == som bare bruker noen av feltene?

Oppsummering

Du har lært om egendefinert likhet:

  • Skriv din egen == når standard sammenligning av hele strukturen blir feil
  • Vanlige tilfeller er bare id, sammenligning uten hensyn til store og små bokstaver, flyttall med epsilon og ignorering av hurtigbuffere
  • Hold hash(into:) konsekvent med de samme feltene
  • Forbli refleksiv, symmetrisk og transitiv

Kurset er fullført! Neste: CustomStringConvertible og Mirror.

Gratis å komme i gang

Lær deg Swift med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
122
Leksjoner
409

Ofte stilte spørsmål

Er leksjonen «Egendefinert likhetssemantikk» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Egendefinert likhetssemantikk», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Egendefinert likhetssemantikk»?

Implementer likhetsregler som er riktige for domenet. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Swift Academy?

Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Egendefinert likhetssemantikk»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?

Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Syntetisert Equatable
  2. Hashable og hash(into:)
  3. Comparable og sortering
  4. Egendefinert likhetssemantikk
← Tilbake til Swift Academy