跳到主要内容

Swift中的Equatable

提示
  1. Equatable协议基础:在Swift中,Equatable协议允许使用==运算符比较两个对象,通过实现自定义比较逻辑以确定对象是否相等。
  2. 使用Hashable实现比较:通过将类型(如结构体或类)遵循Hashable协议,可以为实例提供哈希值,用于比较实例。例如,比较两个Employee对象的name属性。
  3. Equatable自定义函数:可以在类型内实现Equatable函数(如static func ==)来自定义比较逻辑。例如,仅比较两个对象的salary属性。

在 Swift 中,Equatable 是一个协议,允许使用 == 运算符比较两个对象。hashValue 用于比较两个实例。

要使用 hashValue,我们首先需要将类型(结构体、类等)遵循(关联)到 Hashable 属性。例如,

struct Employee: Hashable {
...
}

这里,我们已经让 Employee 结构体遵循了 Hashable 协议。

现在当我们创建 Employee 的实例时,协议将为实例提供哈希值。

示例:Swift Equatable 协议

struct Employee: Hashable {
var name: String
}

let obj1 = Employee(name: "Sabby")
let obj2 = Employee(name: "Smith")

// 比较 obj1 和 obj2
if obj1 == obj2 {
print("obj1 和 obj2 是相等的")
}
else {
print("obj1 和 obj2 不是相等的")
}

输出

obj1 和 obj2 不是相等的

这里,代码 obj1 == obj2 计算结果为 false,因为 obj1obj2name 属性有不同的值。因此,执行了 else 块。

注意:哈希值是一个长整数,根据你所使用的系统可能会有不同的值,所以你可能会得到相同代码的不同值。

使用 Hashable 协议比较实例

// 让 Employee 遵循 Equatable
struct Employee: Equatable {

var name: String
var salary: Int
}

// 初始化两个具有不同属性值的对象
let obj1 = Employee(name: "Sabby", salary: 40000)
let obj2 = Employee(name: "Sabby", salary: 40000)
let obj3 = Employee(name: "Cathy", salary: 30000)

// 比较 obj1 和 obj2
if obj1 == obj2 {
print("obj1 和 obj2 是相等的")
}
else {
print("obj1 和 obj2 不是相等的")
}

// 比较 obj1 和 obj3
if obj1 == obj3 {
print("obj1 和 obj3 是相等的")
}
else {
print("obj1 和 obj3 不是相等的")
}

输出

obj1 和 obj2 是相等的
obj1 和 obj3 不是相等的

在上面的示例中,我们创建了三个对象:obj1、obj2 和 obj3,它们都是 Employee 结构体的实例。

这里,代码 obj1 == obj2 返回 true,因为两个对象的 name 和 salary 属性都有相同的值。

类似地,代码 obj1 == obj3 返回 false,因为两个对象的 name 和 salary 属性有不同的值。

Equatable 函数

在上面的示例中,我们比较了结构体的所有属性。

然而,有时我们可能只想比较类型的选择性属性。在这种情况下,我们可以在类型内使用 equatable 函数。例如,

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

这里,lhs.salary == rhs.salary 只会比较两个给定对象的 salary 属性。

Equatable 函数的使用

struct Employee: Equatable {

var name: String
var salary: Int

// 创建一个 equatable 函数来仅比较 salary 属性
static func == (lhs: Employee, rhs: Employee) -> Bool {
return lhs.salary == rhs.salary
}
}

// 初始化两个 name 属性不同的对象
let obj1 = Employee(name: "Sabby", salary: 34000)
let obj2 = Employee(name: "Cathy", salary: 34000)

// 比较 obj1 和 obj2
if obj1 == obj2 {
print("obj1 和 obj2 是相等的")
}
else {
print("obj1 和 obj2 不是相等的")
}

输出

obj1 和 obj2 是相等的

在上

面的示例中,我们使用了 ==() 函数根据 salary 属性来比较两个实例,

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

这里,ob1obj2 的 salary 是相同的,所以执行了 if 块。

如果我们为 salary 提供了不同的值,那么 else 块将被执行。