Equatable 是 Swift 中的一个协议,它允许你比较两个对象是否相等。具体来说,符合 Equatable 协议的类型必须实现 == 运算符,这样你就可以使用 == 来比较两个对象是否相同。

  1. 为什么需要 Equatable?

在许多情况下,我们需要比较两个对象的值是否相同。例如:

•    判断两个数据模型是否相等。
•    在集合(如数组、字典等)中检查是否存在某个特定的对象。
•    在排序操作中使用。

通过让一个类型遵循 Equatable 协议,我们可以方便地比较该类型的两个实例。

  1. 如何使用 Equatable 协议
  2. 定义符合 Equatable 协议的类型

如果你的类型的所有属性都已经符合 Equatable,那么 Swift 会自动为你提供 == 运算符的实现。但如果你需要自定义比较逻辑,可以手动实现 == 运算符。

struct Person: Equatable {

var name: String
var age: Int

}

在上面的例子中,Person 结构体符合了 Equatable 协议,因此可以使用 == 来比较两个 Person 实例。

  1. 使用 == 比较两个实例

一旦类型符合了 Equatable 协议,你就可以直接使用 == 运算符来比较两个对象是否相等。

let person1 = Person(name: "Alice", age: 30)
let person2 = Person(name: "Alice", age: 30)
let person3 = Person(name: "Bob", age: 25)

print(person1 == person2) // 输出: true
print(person1 == person3) // 输出: false

在这个例子中,person1 和 person2 被认为是相等的,因为它们的 name 和 age 属性都相同,而 person1 和 person3 不相等。

  1. 自定义 == 运算符

如果你的类型包含的属性的比较逻辑不止是简单的值相等,你可以手动实现 == 运算符。

struct Person: Equatable {

var name: String
var age: Int

static func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.name.lowercased() == rhs.name.lowercased() && lhs.age == rhs.age
}

}

在这个例子中,我们手动实现了 == 运算符,比较时忽略了名字的大小写,因此 Person(name: "alice", age: 30) 和 Person(name: "Alice", age: 30) 会被认为是相等的。

  1. Equatable 与 Comparable 的区别
    • Equatable 协议只关心两个对象是否相等,要求实现 == 运算符。
    • Comparable 协议除了要求实现 == 外,还要求实现 < 运算符,以便在排序或比较大小时使用。

一个类型可以同时符合这两个协议。例如:

struct Person: Equatable, Comparable {

var name: String
var age: Int

static func ==(lhs: Person, rhs: Person) -> Bool {
    return lhs.age == rhs.age
}

static func <(lhs: Person, rhs: Person) -> Bool {
    return lhs.age < rhs.age
}

}

在这个例子中,Person 既可以比较是否相等(==),也可以比较大小(<)。

  1. Equatable 的应用
    • 集合操作:例如在数组中查找某个元素,或者过滤出所有与给定对象相等的元素。

let people = [Person(name: "Alice", age: 30), Person(name: "Bob", age: 25)]
let targetPerson = Person(name: "Alice", age: 30)

if people.contains(targetPerson) {

print("找到了 Alice")

}

•    去重操作:使用 Equatable 可以去重集合中的元素。

let people = [

Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Alice", age: 30)

]

let uniquePeople = Array(Set(people)) // 会去除重复的 Person

•    排序操作:Equatable 协议通常与 Comparable 协议一起使用来进行排序,比较两个对象的大小。

let people = [

Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Charlie", age: 35)

]

let sortedPeople = people.sorted() // 默认根据 age 排序

  1. 总结
    • Equatable 协议使得类型的实例可以使用 == 运算符进行比较。
    • 默认情况下,Swift 会为所有符合 Equatable 协议的类型提供 == 实现(前提是类型的属性也符合 Equatable)。
    • 你可以自定义 == 运算符的实现,以满足特定的比较需求。
    • 通过 Equatable,你可以方便地在集合中查找、去重、判断等操作中使用对象比较。
最后修改:2024 年 12 月 20 日
如果觉得我的文章对你有用,请随意赞赏