0Pricing
Swift Academy · Pelajaran

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 collapsed

Menggunakan 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)  // 1

Menggabungkan 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)  // true

Mengapa 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"))  // true

Enumerasi 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)  // 2

Menghapus 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 on

Menghitung 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"]!)  // 3

Pemeriksaan Singkat

Aturan apa yang harus dipatuhi oleh hash(into:) terkait dengan ==?

Ringkasan

Anda telah mempelajari Hashable:

  • Hashable menyempurnakan Equatable dan diperlukan untuk kunci Set/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

  1. Equatable yang Dihasilkan Otomatis
  2. Hashable dan hash(into:)
  3. Comparable dan Pengurutan
  4. Semantik Kesetaraan Kustom
← Kembali ke Swift Academy