Menu
CoddyTech

Hashable

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 40 dari 57.

Hashable memungkinkan nilai disimpan dalam Set atau digunakan sebagai kunci Dictionary. Hash adalah angka yang dihitung dari nilai dan digunakan untuk menemukannya dengan cepat. Struct dan enum yang semua propertinya Hashable mendapatkannya dengan mendeklarasikan konformansi:

struct Point: Hashable {
    let x: Int, y: Int
}

var visited: Set<Point> = []
visited.insert(Point(x: 0, y: 0))
visited.insert(Point(x: 1, y: 0))
visited.insert(Point(x: 0, y: 0))
print(visited.count)
print(visited.contains(Point(x: 1, y: 0)))

Output:

2
true

Nilai yang dapat di-hash cocok dijadikan kunci dictionary, misalnya untuk menghitung kemunculan nilai terstruktur:

struct Pair: Hashable {
    let from: String, to: String
}

let trips = [Pair(from: "A", to: "B"), Pair(from: "B", to: "C"), Pair(from: "A", to: "B")]
var counts: [Pair: Int] = [:]
for t in trips { counts[t, default: 0] += 1 }
print(counts[Pair(from: "A", to: "B")]!)

Output:

2

Hashable dibangun berdasarkan Equatable. Ketika == hanya membandingkan beberapa property, hash harus menggunakan property yang sama, yang dilakukan di hash(into:). Jika tidak, dua nilai yang sama bisa mendapatkan hash yang berbeda dan set akan menyimpan keduanya:

struct User: Hashable {
    let id: Int
    var name: String

    static func == (lhs: User, rhs: User) -> Bool { lhs.id == rhs.id }
    func hash(into hasher: inout Hasher) { hasher.combine(id) }
}

let users: Set<User> = [User(id: 1, name: "Ada"), User(id: 1, name: "Ada L."), User(id: 2, name: "Bo")]
print(users.count)

Output:

2

Aturan yang perlu diingat: nilai yang sama harus memiliki hash yang sama. Nilai hash berubah di antara eksekusi program, jadi jangan pernah menyimpan atau mencetaknya; gunakan hash hanya melalui set dan dictionary.

// nilai yang sama -> hash yang sama (wajib)
// nilai yang berbeda -> biasanya hash yang berbeda
func hash(into hasher: inout Hasher) {
    hasher.combine(id)          // tepat property yang dibandingkan oleh ==
}
challenge icon

Tantangan

Mudah

Sebuah robot di atas grid bergerak U, D, L, R satu langkah setiap kali dari (0, 0). Buat Position (x, y) menjadi Hashable dan lengkapi explore(_:), yang mengembalikan tiga baris: visited 5 cells (jumlah posisi berbeda, termasuk posisi awal), revisits 2 (gerakan yang berakhir di sel yang sudah dikunjungi) dan most visited (0, 0) x3 (sel yang paling sering dimasuki, dengan posisi awal dihitung sebagai satu kunjungan; sel pertama yang mencapai jumlah tersebut menang jika ada nilai yang sama).

Kode yang disediakan membaca satu baris gerakan dan mencetak setiap baris yang dikembalikan.

Tulis kodemu di Position.swift dan Functions.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

// Kode input/output yang disediakan: biarkan tetap seperti semula
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in explore(input[0]) { print(line) }
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Swift