在 Swift 中,Equatable 是一个协议,允许使用 ==
运算符比较两个对象。hashValue
用于比较两个实例。
要使用 hashValue
,我们首先必须使类型(struct、class 等)符合 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")
// compare obj1 and obj2
if obj1 == obj2 {
print("obj1 and obj2 are equal")
}
else {
print("obj1 and obj2 are not equal")
}
输出
obj1 and obj2 are not equal
在这里,代码 obj1 == obj2 的计算结果为 false,因为 obj1 和 obj2 的 name 属性值不同。因此,执行 else 块。
注意:哈希值是一个长整数,取决于你使用的系统,因此对于相同的代码,你可能会得到不同的值。
使用 Hashable 协议比较实例
// conform Employee to Equatable
struct Employee: Equatable {
var name: String
var salary: Int
}
// initialize two objects with different property values
let obj1 = Employee(name: "Sabby", salary: 40000)
let obj2 = Employee(name: "Sabby", salary: 40000)
let obj3 = Employee(name: "Cathy", salary: 30000)
// compare obj1 and obj2
if obj1 == obj2 {
print("obj1 and obj2 are equal")
}
else {
print("obj1 and obj2 are not equal")
}
// compare obj1 and obj3
if obj1 == obj3 {
print("obj1 and obj3 are equal")
}
else {
print("obj1 and obj3 are not equal")
}
输出
obj1 and obj2 are equal obj1 and obj3 are not equal
在上面的示例中,我们创建了三个对象: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
// create a equatable function to only compare age property
static func == (lhs: Employee, rhs: Employee) -> Bool {
return lhs.salary == rhs.salary
}
}
// initialize two objects with different values for name property
let obj1 = Employee(name: "Sabby", salary: 34000)
let obj2 = Employee(name: "Cathy", salary: 34000)
// compare obj1 and obj2
if obj1 == obj2 {
print("obj1 and obj2 are equal")
}
else {
print("obj1 and obj2 are not equal")
}
输出
obj1 and obj2 are equal
在上面的示例中,我们使用 ==()
函数根据 salary 属性比较了两个实例,
static func == (lhs: Employee, rhs: Employee) -> Bool {
return lhs.salary == rhs.salary
}
ob1 和 obj2 的 salary 相同,因此执行 if
块。
如果我们提供了不同的 salary 值,则会执行 else
块。