Semantik Kesamaan Tersuai
Laksanakan peraturan kesamaan yang tepat untuk domain anda.
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)) // trueKesamaan 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")) // trueKekalkan 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) // 1Kesamaan 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) // trueKesamaan 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)) // trueKesamaan 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)) // truePatuhi 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 trueKesamaan 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) // 1Semakan 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.
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
- Equatable Dijana Automatik
- Hashable dan hash(into:)
- Comparable dan Pengisihan
- Semantik Kesamaan Tersuai