Swift中的Equatable
提示
- Equatable协议基础:在Swift中,Equatable协议允许使用
==
运算符比较两个对象,通过实现自定义比较逻辑以确定对象是否相等。 - 使用Hashable实现比较:通过将类型(如结构体或类)遵循Hashable协议,可以为实例提供哈希值,用于比较实例。例如,比较两个Employee对象的name属性。
- 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,因为 obj1
和 obj2
的 name
属性有不同的值。因此,执行了 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
}
这里,ob1
和 obj2
的 salary 是相同的,所以执行了 if
块。
如果我们为 salary
提供了不同的值,那么 else
块将被执行。