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 反馈 — 无需本地设置。
此课程中的所有课时
- 运算符重载与优先级组
- 下标与自定义索引再探
- Hashable/Equatable/Comparable 派生