Swift Academy · Pelajaran

Semantik Kesamaan Tersuai

Laksanakan peraturan kesamaan yang tepat untuk domain anda.

Pelajaran 4 daripada 413 langkah

Semantik Kesamaan Tersuai ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apabila == Lalai Tidak Tepat

== yang dijana membandingkan setiap sifat tersimpan. Kadangkala perbandingan ini terlalu ketat (anda hanya mengambil berat tentang id) atau terlalu longgar. Dalam keadaan itu, anda menulis == sendiri.

Kesamaan Berasaskan Identiti

Anggap dua rekod sama apabila idnya sepadan, sambil mengabaikan medan lain:

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

Kesamaan Tanpa Mengira Huruf Besar atau Kecil

Normalkan sebelum membandingkan:

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

Kekalkan Hashable Konsisten

Jika anda menyesuaikan ==, anda MUST mengemas kini hash(into:) supaya menggunakan medan yang sama. Jika tidak, nilai yang sama mungkin menghasilkan cincangan berbeza dan merosakkan Set.

<code>==</code> dan hash(into:) yang Selaras

Kedua-duanya hanya menggunakan id, lalu kekal konsisten:

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

Kesamaan yang Mengabaikan Cache

Kecualikan medan terbitan atau cache daripada perbandingan:

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

Kesamaan Titik Apung Bertoleransi

Bandingkan nilai double dalam lingkungan epsilon, bukannya secara tepat:

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

Kesamaan Merentas Sebahagian Medan

Bandingkan subset yang bermakna untuk kesamaan domain:

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

Patuhi Hukum Equatable

== tersuai mesti kekal refleksif (a == a), simetri (a == b membayangkan b == a) dan transitif. Pelanggaran hukum ini mengelirukan koleksi dan algoritma.

Pelaksanaan Simetri

Membandingkan bentuk yang dinormalkan mengekalkan kesimetrian:

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

Kesamaan Tersuai dalam Set

Oleh sebab kesamaan dan pencincangan yang hanya berdasarkan id adalah selaras, Set menganggap nilai dengan id yang sama sebagai satu nilai:

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

Semakan Pantas

Selepas menulis == tersuai yang hanya menggunakan sesetengah medan, apakah yang mesti anda lakukan juga?

Ringkasan

Anda telah mempelajari kesamaan tersuai:

  • Tulis == sendiri apabila perbandingan keseluruhan struct secara lalai tidak tepat
  • Kes biasa: berdasarkan id sahaja, tidak peka huruf besar atau kecil, titik apung dengan epsilon, dan mengabaikan cache
  • Kekalkan hash(into:) konsisten dengan medan yang sama
  • Kekalkan sifat refleksif, simetri dan transitif

Kursus selesai! Seterusnya: CustomStringConvertible dan Mirror.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Semantik Kesamaan Tersuai” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Semantik Kesamaan Tersuai”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Semantik Kesamaan Tersuai”?

Laksanakan peraturan kesamaan yang tepat untuk domain anda. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Semantik Kesamaan Tersuai” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Equatable Dijana Automatik
  2. Hashable dan hash(into:)
  3. Comparable dan Pengisihan
  4. Semantik Kesamaan Tersuai
← Kembali ke Swift Academy