自动合成的 Equatable
免费获得 ==,并在需要时自定义实现。
自动合成的 Equatable 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
什么是相等性协议
Equatable 是为类型提供 == 运算符的协议。遵循该协议后,您可以比较两个值是否相等,并将它们用于 contains、firstIndex 等操作。
自动遵循协议
对于所有存储属性都遵循 Equatable 的结构体,Swift 会为您自动生成 ==,您只需声明遵循该协议:
struct Point: Equatable {
let x: Int
let y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2)) // true
print(Point(x: 1, y: 2) == Point(x: 9, y: 2)) // false合成的工作原理
生成的 == 会逐一比较每一对存储属性。只有全部相等时,两个值才相等:
struct User: Equatable {
let name: String
let age: Int
}
let a = User(name: "Ann", age: 30)
let b = User(name: "Ann", age: 31)
print(a == b) // false (age differs)在集合中使用 ==
Equatable 会解锁许多数组操作:
struct Tag: Equatable { let name: String }
let tags = [Tag(name: "a"), Tag(name: "b")]
print(tags.contains(Tag(name: "b"))) // true
print(tags.firstIndex(of: Tag(name: "a"))!) // 0枚举同样支持相等性
枚举同样会自动合成 Equatable。没有关联值的枚举即使不声明也支持相等性;有具有关联值时,声明遵循该协议后,关联值也会参与比较。
带关联值的相等枚举
关联值会参与比较:
enum Status: Equatable {
case active
case error(code: Int)
}
print(Status.error(code: 404) == Status.error(code: 404)) // true
print(Status.error(code: 404) == Status.error(code: 500)) // false嵌套类型
合成具有组合性:包含 Equatable 成员的结构体本身也可以自动合成:
struct Line: Equatable {
let start: Int
let end: Int
}
struct Shape: Equatable {
let lines: [Line]
}
print(Shape(lines: [Line(start: 0, end: 1)]) == Shape(lines: [Line(start: 0, end: 1)])) // true合成失败的情况
如果任何存储属性不遵循 Equatable,就无法进行自动合成,您必须自行编写 ==(稍后会介绍):
struct Box: Equatable {
let id: Int
static func == (l: Box, r: Box) -> Bool { l.id == r.id }
}
print(Box(id: 1) == Box(id: 1)) // true类不会自动合成
引用类型不会自动获得合成的 ==;您必须自行实现它(比较身份或字段):
final class Account: Equatable {
let id: Int
init(id: Int) { self.id = id }
static func == (l: Account, r: Account) -> Bool { l.id == r.id }
}
print(Account(id: 7) == Account(id: 7)) // true!= 可自动获得
一旦存在 ==,!= 就会自动作为它的否定形式生成:
struct Color: Equatable { let hex: String }
print(Color(hex: "#fff") != Color(hex: "#000")) // true在泛型代码中使用相等性
Equatable 允许泛型函数比较元素,许多算法都需要这一能力:
func allSame<T: Equatable>(_ xs: [T]) -> Bool {
guard let first = xs.first else { return true }
return xs.allSatisfy { $0 == first }
}
print(allSame([2, 2, 2])) // true
print(allSame(["a", "b"])) // false快速检查
声明 Equatable 后,Swift 会为哪种类型自动合成 ==?
总结
您学习了相等性协议:
Equatable提供==(以及自动提供的!=)- 包含 Equatable 成员的结构体和枚举会自动合成
== - 支持使用
contains、firstIndex(of:)等操作 - 类和不遵循 Equatable 的成员需要手动实现
==
接下来:可哈希协议。
常见问题解答
「自动合成的 Equatable」课时是免费的吗?
是的 — 「自动合成的 Equatable」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「自动合成的 Equatable」这节课中我会学到什么?
免费获得 ==,并在需要时自定义实现。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「自动合成的 Equatable」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 自动合成的 Equatable
- Hashable 与 hash(into:)
- Comparable 与排序
- 自定义相等语义