Menu
Coddy logo textTech

Hashable

Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 40 / 57.

Hashable, değerlerin bir Set içinde saklanmasını veya Dictionary anahtarları olarak kullanılmasını sağlar. Hash, değerden hesaplanan ve değeri hızlı bir şekilde bulmak için kullanılan bir sayıdır. Tüm özellikleri Hashable olan struct ve enum türleri, uyumluluğu bildirerek bunu elde eder:

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)))

Çıktı:

2
true

Hashable değerler sözlük anahtarları olarak kullanıma uygundur; örneğin yapılandırılmış değerlerin oluşumlarını saymak için:

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

Çıktı:

2

Hashable, Equatable üzerine kuruludur. == yalnızca bazı özellikleri karşılaştırdığında, karma değeri de aynı özellikleri kullanmalıdır; bu işlem hash(into:) içinde yapılır. Aksi takdirde iki eşit değer farklı karma değerler alabilir ve bir küme her ikisini de saklayabilir:

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)

Çıktı:

2

Hatırlanması gereken kural: eşit olan değerlerin hash değerleri eşit olmalıdır. Hash değerleri program çalıştırmaları arasında değişir, bu nedenle onları asla saklamayın veya yazdırmayın; onları yalnızca kümeler ve sözlükler aracılığıyla kullanın.

// eşit değerler -> eşit hash'ler (gerekli)
// farklı değerler -> genellikle farklı hash'ler
func hash(into hasher: inout Hasher) {
    hasher.combine(id)          // tam olarak == operatörünün karşılaştırdığı özellikler
}
challenge icon

Görev

Kolay

Bir robot, ızgara üzerinde (0, 0) konumundan başlayarak her seferinde bir adımda U, D, L, R yönlerinde hareket eder. Position (x, y) yapısını Hashable yapın ve üç satır döndüren explore(_:) işlevini tamamlayın: visited 5 cells (başlangıç dahil farklı konumların sayısı), revisits 2 (daha önce ziyaret edilmiş bir hücreye ulaşan hamlelerin sayısı) ve most visited (0, 0) x3 (başlangıç ziyareti bir kez sayılmak üzere en çok girilen hücre; eşitliklerde bu sayıya ilk ulaşan kazanır).

Sağlanan kod, bir satır hareket okur ve döndürülen her satırı yazdırır.

Kodunuz Position.swift ve Functions.swift dosyalarına yazılmalıdır. main.swift sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in explore(input[0]) { print(line) }
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Swift playground