Назад к вопросам
Junior
81
questionbank
Что нужно сделать, чтобы структура или класс пользователя стали ключом в словаре?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Структура или класс должны быть хэшируемыми. Для структуры или класса, содержащего только хэшируемые типы (например, Int, String, Bool), компилятор автоматически синтезирует реализацию протокола Hashable. Если структура или класс содержат нехэшируемые типы или требуют специальной логики хэширования, необходимоL
- Реализовать протокол
Hashable. - В методе
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 свойствами (или для особой логики сравнения), требуется ручная реализация ==.