Ответ
Тип ключа в Dictionary должен соответствовать протоколу Hashable. Это гарантирует, что ключ можно однозначно идентифицировать и эффективно искать по нему в хеш-таблице, лежащей в основе словаря.
Что это означает на практике:
- Тип должен уметь генерировать целочисленный хеш (
hashValue) через методhash(into:). - Тип должен реализовывать оператор
==для проверки равенства (часть протоколаEquatable, от которого наследуетHashable).
Примеры типов, которые уже являются Hashable и готовы к использованию:
- Все базовые типы:
Int,String,Bool,Doubleи т.д. - Типы
Optional,Array,Dictionary,Set, если их элементыHashable. - Перечисления (
enum) без ассоциированных значений или со значениямиHashableтипов.
Как сделать пользовательский тип ключом:
Для структур и перечисмов Swift часто синтезирует соответствие Hashable автоматически. Для классов его нужно реализовать вручную (см. предыдущий вопрос).
// Swift автоматически делает эту структуру Hashable
struct Coordinate: Hashable {
let x: Int
let y: Int
}
var terrain: [Coordinate: String] = [:
terrain[Coordinate(x: 10, y: 20)] = "Mountain"
// Перечисление также может быть ключом
enum AppState: Hashable {
case active, background, suspended
}
var stateHandlers: [AppState: () -> Void] = [: