Sobes.tech
Junior

O que é necessário fazer para que a estrutura ou classe de usuário se torne uma chave em um dicionário?

sobes.tech IA

Resposta da IA

Estruturas ou classes devem ser hasháveis. Para uma estrutura ou classe que contém apenas tipos hasháveis (por exemplo, Int, String, Bool), o compilador gera automaticamente a implementação do protocolo Hashable. Se a estrutura ou classe contiver tipos não hasháveis ou exigir lógica especial de hashing, é necessário:

  1. Implementar o protocolo Hashable.
  2. No método hash(into:), adicionar os componentes hasháveis da instância ao hasher fornecido.
struct User: Hashable {
    let id: UUID // UUID é Hashable por padrão
    let name: String // String é Hashable por padrão

    // Gerado automaticamente se todas as propriedades forem Hashable
    // 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
    }

    // Implementação manual para a classe
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Também é necessário implementar Equatable para Hashable
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

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

Também é necessário implementar o protocolo Equatable, pois Hashable herda de Equatable. O compilador gera automaticamente a implementação de Equatable para estruturas cujas propriedades também sejam Equatable. Para classes ou estruturas com propriedades não Equatable (ou para lógica de comparação personalizada), é necessária uma implementação manual de ==.