编程Swift开发者

Swift中的数据结构Dictionary是如何工作的?在优化使用时需要考虑哪些实现特性,以及在存储和处理复杂键时可能出现哪些困难?

用 Hintsage AI 助手通过面试

回答。

Dictionary 是Swift中的一种关联容器,用于存储“键-值”对。键必须实现HashableEquatable协议,以确保唯一性和对元素的常量时间访问。

特性:

  • 键必须是唯一的。
  • 访问、添加和删除操作的摊销时间复杂度为O(1)。
  • 复杂键的使用是可能的,只要清楚地实现了HashableEquatable

示例:

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