Sobes.tech
Junior

Ce trebuie făcut pentru ca structura sau clasa utilizatorului să devină o cheie într-un dicționar?

sobes.tech AI

Răspuns de la AI

Structurile sau clasele trebuie să fie hash-abile. Pentru o structură sau clasă care conține doar tipuri hash-abile (de exemplu, Int, String, Bool), compilatorul generează automat implementarea protocolului Hashable. Dacă structura sau clasa conține tipuri non-hash-abile sau necesită logică specială de hash, este necesar:

  1. Să implementeze protocolul Hashable.
  2. În metoda hash(into:), să adauge componentele hash-abile ale instanței în hasher-ul furnizat.
struct User: Hashable {
    let id: UUID // UUID este hash-abil implicit
    let name: String // String este hash-abil implicit

    // Se generează automat dacă toate proprietățile sunt hash-abile
    // 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
    }

    // Implementare manuală pentru clasă
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // De asemenea, trebuie implementată și `Equatable`
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Exemplu de utilizare
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Este, de asemenea, necesar să se implementeze protocolul Equatable, deoarece Hashable moștenește de la Equatable. Compilatorul generează automat implementarea Equatable pentru structurile ale căror proprietăți sunt, de asemenea, Equatable. Pentru clase sau structuri cu proprietăți non-Equatable (sau pentru logica de comparare personalizată), este necesară o implementare manuală a ==.