Egendefinert likhetssemantikk
Implementer likhetsregler som er riktige for domenet.
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)) // trueLikhet 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")) // trueHold 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) // 1Likhet 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) // trueTolerant 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)) // trueLikhet 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)) // trueFø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 trueEgendefinert 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) // 1Hurtigsjekk
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.
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
- Syntetisert Equatable
- Hashable og hash(into:)
- Comparable og sortering
- Egendefinert likhetssemantikk