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
trueNilai 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:
2Hashable 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:
2Aturan 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 ==
}Tantangan
MudahSebuah 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) }
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift