0Pricing
Swift Academy · 课时

Hashable/Equatable/Comparable 派生

让 Swift 为简单的结构体和枚举 合成 Equatable/Hashable(以及 Codable);在需要时实现自定义 Comparable (字典序)和手动 hash(into:) 。

Hashable/Equatable/Comparable 派生 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 3 节课。

哪些内容会自动生成?

Swift 可以为简单类型自动生成常见的协议遵循:

  • 可等同性:值相等
  • 可哈希性:字典或集合的键
  • 可编码性:编码和解码

您需要自行实现可比较性(按字典序),或者在适用时依赖枚举的案例顺序。

结构体的自动生成

对于存储属性都遵循可等同性或可哈希性协议的结构体,Swift 会自动生成这两种协议遵循。

struct Point: Equatable, Hashable {
    var x: Int
    var y: Int
    // No extra code: Equatable & Hashable are synthesized
}
let p1 = Point(x: 1, y: 2)
let p2 = Point(x: 1, y: 2)
print(p1 == p2)                 // true
let set: Set<Point> = [p1, p2]  // Hashable works; duplicates coalesce
print(set.count)                // 1

枚举的可比较性

没有关联值的枚举可以根据案例顺序自动生成可比较性协议遵循。

enum Priority: Comparable { case low, medium, high }
// Comparable is synthesized using case order: low < medium < high
print(Priority.low < .high)  // true

结构体的可比较性

对于结构体,请手动编写<。简单的字典序比较(先比较 last,再比较 first)很常见。

struct Person: Comparable, Hashable {
    let last: String
    let first: String
    static func < (lhs: Person, rhs: Person) -> Bool {
        if lhs.last != rhs.last { return lhs.last < rhs.last }
        return lhs.first < rhs.first
    }
}
let a = Person(last: "Doe", first: "Ana")
let b = Person(last: "Doe", first: "Max")
print(a < b)   // true (Ana before Max)

自定义相等性与哈希

当相等性或哈希值应忽略格式差异(例如大小写和空格)时,请编写==和hash(into:)。

struct FileID: Hashable, Equatable {
    let path: String
    // Normalize case/trim when hashing & comparing
    static func == (l: FileID, r: FileID) -> Bool {
        l.path.lowercased().trimmingCharacters(in: .whitespaces) ==
        r.path.lowercased().trimmingCharacters(in: .whitespaces)
    }
    func hash(into hasher: inout Hasher) {
        hasher.combine(path.lowercased().trimmingCharacters(in: .whitespaces))
    }
}
let f1 = FileID(path: " Readme.md ")
let f2 = FileID(path: "readme.md")
print(f1 == f2)                 // true
print(Set([f1, f2]).count)      // 1

最佳实践

建议:

  • 保持==和hash(into:)一致:相等的值必须产生相等的哈希值。
  • 优先使用自动生成;只有在需要自定义语义时才手动实现。
  • 记录可比较性的排序规则。
  • 当简单的有序等级足够时,请使用没有负载的枚举。

自动生成检查清单

快速检查:对于简单的结构体或枚举,Swift 可以自动生成哪些内容?

回顾

回顾:让 Swift 为简单模型自动生成可等同性/可哈希性(以及可编码性)。使用清晰的字典序规则实现可比较性,或在可能时依赖枚举案例顺序。

常见问题解答

「Hashable/Equatable/Comparable 派生」课时是免费的吗?

是的 — 「Hashable/Equatable/Comparable 派生」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。

「Hashable/Equatable/Comparable 派生」这节课中我会学到什么?

让 Swift 为简单的结构体和枚举 合成 Equatable/Hashable(以及 Codable);在需要时实现自定义 Comparable (字典序)和手动 hash(into:) 。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。

「Hashable/Equatable/Comparable 派生」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 运算符重载与优先级组
  2. 下标与自定义索引再探
  3. Hashable/Equatable/Comparable 派生
← 返回 Swift Academy