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 obj2if 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 Equatablestruct Employee: Equatable {var name: Stringvar salary: Int}// initialize two objects with different property valueslet obj1 = Employee(name: "Sabby", salary: 40000)let obj2 = Employee(name: "Sabby", salary: 40000)let obj3 = Employee(name: "Cathy", salary: 30000)// compare obj1 and obj2if obj1 == obj2 {print("obj1 and obj2 are equal")}else {print("obj1 and obj2 are not equal")}// compare obj1 and obj3if obj1 == obj3 {print("obj1 and obj3 are equal")}else {print("obj1 and obj3 are not equal")}
结果如下:
obj1 and obj2 are equalobj1 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: Stringvar salary: Int// create a equatable function to only compare age propertystatic func == (lhs: Employee, rhs: Employee) -> Bool {return lhs.salary == rhs.salary}}// initialize two objects with different values for name propertylet obj1 = Employee(name: "Sabby", salary: 34000)let obj2 = Employee(name: "Cathy", salary: 34000)// compare obj1 and obj2if 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 代码块就会被执行。