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:
- Implementar o protocolo
Hashable. - 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 ==.