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。结果——具有相同参数的元素被视为不同的键,导致重复和查找过程中出现错误。