Sobes.tech
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:

  1. Hashable protokolü uygulanmalıdır.
  2. 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.