Dictionary — ассоциативный контейнер в Swift, который хранит пары «ключ–значение». Ключи обязаны реализовывать протоколы Hashable и Equatable для обеспечения уникальности и постоянного времени доступа к элементам.
Особенности:
Hashable и Equatable.Пример:
struct EmployeeID: Hashable { let company: String let id: Int } var employees: [EmployeeID: String] = [ EmployeeID(company: "A", id: 1): "Alice", EmployeeID(company: "B", id: 2): "Bob" ] let empName = employees[EmployeeID(company: "A", id: 1)] // Alice
Может ли Dictionary принимать в качестве ключа пользовательский тип, который не реализует Hashable?
— Некорректно. Если тип не реализует Hashable, он не может выступать в качестве ключа. Попытка использования приведёт к ошибке компиляции.
Пример:
class Foo {} var dict: [Foo: Int] = [:] // Ошибка: Foo не реализует Hashable
История
В проекте хранили ключи Dictionary на основе структур с массивами внутри. Структура не соответствовала протоколу Hashable, из-за чего Dictionary не работал. Решение: реализовать собственный hashValue, учитывающий все поля, включая массивы.
История
Использовали NSObject-подклассы в качестве ключей, полагаясь на адрес объекта. После переписывания части кода под структуры данные перестали совпадать: хэш значения структур рассчитывались иначе, что приводило к потере доступности данных.
История
При хранении словаря со сложным ключом забыли реализовать Equatable. Результат — элементы с одинаковыми параметрами считались разными ключами, возникали дубликаты и ошибки при поиске по словарю.