Junior
Bir yapının veya kullanıcının sınıfının sözlükte anahtar olması için ne yapılmalı?
sobes.tech yapay zeka
AI'dan gelen yanıt
Yapılar veya sınıflar hashlenebilir olmalıdır. Sadece hashlenebilir türleri içeren bir yapı veya sınıf (örneğin, Int, String, Bool) için derleyici otomatik olarak Hashable protokolünün uygulamasını oluşturur. Eğer yapı veya sınıf hashlenemeyen türler içeriyorsa veya özel bir hashleme mantığı gerektiriyorsa:
Hashableprotokolü uygulanmalıdır.hash(into:)metodunda, örneğin hashlenebilir bileşenler sağlanan hashera eklenmelidir.
struct User: Hashable {
let id: UUID // UUID varsayılan olarak Hashable'dır
let name: String // String varsayılan olarak Hashable'dır
// Tüm özellikler Hashable ise otomatik olarak türetilir
// func hash(into hasher: inout Hasher) {
// hasher.combine(id)
// hasher.combine(name)
// }
}
class Settings: Hashable {
var difficulty: Int
var volume: Float
init(difficulty: Int, volume: Float) {
self.difficulty = difficulty
self.volume = volume
}
// Sınıf için manuel uygulama
func hash(into hasher: inout Hasher) {
hasher.combine(difficulty)
hasher.combine(volume)
}
// Ayrıca `Equatable` uygulaması da gereklidir
static func == (lhs: Settings, rhs: Settings) -> Bool {
lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
}
}
// Kullanım örneği
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]
Ayrıca, Hashable Equatable'den türediği için, Equatable protokolü de uygulanmalıdır. Derleyici, özellikleri de Equatable olan yapılar için otomatik olarak Equatable uygulamasını oluşturur. Equatable olmayan özelliklere sahip sınıflar veya yapılar (veya özel karşılaştırma mantığı gerektiren durumlar) için manuel == uygulaması gerekir.