0Pricing
Swift Academy · 课时

自动合成的 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 自动合成的 Equatable
  2. Hashable 与 hash(into:)
  3. Comparable 与排序
  4. 自定义相等语义
← 返回 Swift Academy