Hashable dan hash(into:)
Aktifkan penggunaan sebagai kunci dictionary dan anggota set.
Hashable dan hash(into:) adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Apa Itu Hash?
Hashable dibangun di atas Equatable dan menyediakan nilai hash. Protokol ini diperlukan agar suatu tipe dapat digunakan sebagai elemen Set atau kunci Dictionary.
Hash Otomatis
Seperti kesetaraan, struktur dan enumerasi dengan anggota yang mendukung hash akan mendapatkan penerapannya secara otomatis:
struct Point: Hashable {
let x: Int
let y: Int
}
let set: Set<Point> = [Point(x: 0, y: 0), Point(x: 0, y: 0)]
print(set.count) // 1 -- duplicate collapsedMenggunakan Tipe sebagai Kunci Kamus
Tipe yang mendukung hash dapat digunakan sebagai kunci kamus:
struct Coord: Hashable { let r: Int; let c: Int }
var grid: [Coord: String] = [:]
grid[Coord(r: 0, c: 0)] = "start"
print(grid[Coord(r: 0, c: 0)]!) // "start"Kontrak Hashable
Dua nilai yang sama (==) MUST menghasilkan nilai hash yang sama. Jika Anda menyesuaikan salah satunya, pastikan keduanya tetap konsisten agar set dan kamus tidak berperilaku keliru.
hash(into:) Kustom
Terapkan hash(into:) dengan memasukkan properti yang relevan ke dalam penghasil hash:
struct User: Hashable {
let id: Int
let name: String
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
static func == (l: User, r: User) -> Bool { l.id == r.id }
}
print(Set([User(id: 1, name: "A"), User(id: 1, name: "B")]).count) // 1Menggabungkan Beberapa Bidang
Masukkan setiap bidang yang ikut menentukan kesetaraan:
struct Pair: Hashable {
let a: Int
let b: String
func hash(into hasher: inout Hasher) {
hasher.combine(a)
hasher.combine(b)
}
}
print(Pair(a: 1, b: "x").hashValue == Pair(a: 1, b: "x").hashValue) // trueMengapa Only untuk Bidang Identitas
Gunakan hash hanya pada bidang yang digunakan dalam ==. Menyertakan bidang tambahan yang dapat berubah dapat melanggar aturan bahwa nilai yang sama harus memiliki hash yang sama:
struct Doc: Hashable {
let id: Int // identity
var title: String // not part of equality
func hash(into hasher: inout Hasher) { hasher.combine(id) }
static func == (l: Doc, r: Doc) -> Bool { l.id == r.id }
}
print(Doc(id: 1, title: "v1") == Doc(id: 1, title: "v2")) // trueEnumerasi yang Mendukung Hash
Enumerasi secara otomatis mendukung hash (termasuk nilai terkait jika nilai-nilai tersebut juga mendukung hash):
enum Direction: Hashable { case north, south, east, west }
let visited: Set<Direction> = [.north, .north, .east]
print(visited.count) // 2Menghapus Duplikat dengan Set
Salah satu penggunaan umum: hapus duplikat dengan melewatkan nilai melalui Set:
let nums = [1, 2, 2, 3, 3, 3]
let unique = Array(Set(nums)).sorted()
print(unique) // [1, 2, 3]Penghasil Hash Diacak pada Setiap Proses
Nilai hash diberi nilai awal pada setiap proses program, jadi jangan pernah menyimpan hashValue ke disk atau mengandalkan angka persisnya di antara beberapa peluncuran program:
struct K: Hashable { let v: Int }
let h1 = K(v: 5).hashValue
// h1 is stable within this run only
print(K(v: 5) == K(v: 5)) // true -- equality is what to rely onMenghitung dengan Kamus
Kunci yang mendukung hash memungkinkan penghitungan frekuensi — pola yang sangat umum:
let letters = ["a", "b", "a", "c", "b", "a"]
var counts: [String: Int] = [:]
for l in letters { counts[l, default: 0] += 1 }
print(counts["a"]!) // 3Pemeriksaan Singkat
Aturan apa yang harus dipatuhi oleh hash(into:) terkait dengan ==?
Ringkasan
Anda telah mempelajari Hashable:
HashablemenyempurnakanEquatabledan diperlukan untuk kunciSet/Dictionary- Dibuat secara otomatis untuk struktur dan enumerasi dengan anggota yang mendukung hash
hash(into:)kustom — gabungkan hanya bidang identitas yang digunakan dalam==- Nilai yang sama harus menghasilkan hash yang sama; hash diacak pada setiap proses
Berikutnya: Comparable dan pengurutan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Hashable dan hash(into:)” gratis?
Ya — teks lengkap “Hashable dan hash(into:)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Hashable dan hash(into:)”?
Aktifkan penggunaan sebagai kunci dictionary dan anggota set. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Hashable dan hash(into:)” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Equatable yang Dihasilkan Otomatis
- Hashable dan hash(into:)
- Comparable dan Pengurutan
- Semantik Kesetaraan Kustom