Swift Equatable 协议
在本教程中,我们将通过示例了解 Swift Equatable 协议。
在 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
代码块。
注意:哈希值是一个长整数,它根据您使用的系统而变化,因此对于同一代码,您可能会得到不同的值。
使用哈希协议比较实例
// 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
在上面的实例中,我们创建了 3 个对象:Employee
结构的 obj1
、obj2
和 obj3
。
这里,代码 obj1 == obj2
返回 true,因为这两个对象的属性 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
代码块就会被执行。