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
trueHashable 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ı:
2Hashable, 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ı:
2Hatı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
}Görev
KolayBir 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) }
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground