Назад к вопросам
Junior
81
questionbank

Что нужно сделать, чтобы структура или класс пользователя стали ключом в словаре?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Структура или класс должны быть хэшируемыми. Для структуры или класса, содержащего только хэшируемые типы (например, Int, String, Bool), компилятор автоматически синтезирует реализацию протокола Hashable. Если структура или класс содержат нехэшируемые типы или требуют специальной логики хэширования, необходимоL

  1. Реализовать протокол Hashable.
  2. В методе hash(into:) добавить хэшируемые компоненты экземпляра в предоставленный хэшер.
struct User: Hashable {
    let id: UUID // UUID принимает Hashable по умолчанию
    let name: String // String принимает Hashable по умолчанию

    // Автоматически синтезируется, если все свойства 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
    }

    // Ручная реализация для класса
    func hash(into hasher: inout Hasher) {
        hasher.combine(difficulty)
        hasher.combine(volume)
    }

    // Также потребуется реализация Equatable для Hashable
    static func == (lhs: Settings, rhs: Settings) -> Bool {
        lhs.difficulty == rhs.difficulty && lhs.volume == rhs.volume
    }
}

// Пример использования
let users: [User: String] = [User(id: UUID(), name: "Alice"): "Manager"]
let gameSettings: [Settings: Bool] = [Settings(difficulty: 5, volume: 0.8): true]

Необходимо также реализовать протокол Equatable, поскольку Hashable наследует от Equatable. Компилятор синтезирует реализацию Equatable для структур, чьи свойства также Equatable. Для классов или структур с не-Equatable свойствами (или для особой логики сравнения), требуется ручная реализация ==.