Swift Equatable 协议

在本教程中,我们将通过示例了解 Swift Equatable 协议。

在 Swift 中,Equatable 是可以使用 == 运算符比较两个对象的协议。hashValue 哈希值用于比较两个实例。

要使用 hashValue,我们首先必须将类型(structclass 等)与 Hashable 属性相一致(关联)。例如,

  1. struct Employee: Hashable {
  2. ...
  3. }

在这里,我们将 Employee 结构与 Hashable 协议相一致。

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


实例:Swift Equatable 协议

  1. struct Employee: Hashable {
  2. var name: String
  3. }
  4. let obj1 = Employee(name: "Sabby")
  5. let obj2 = Employee(name: "Smith")
  6. // compare obj1 and obj2
  7. if obj1 == obj2 {
  8. print("obj1 and obj2 are equal")
  9. }
  10. else {
  11. print("obj1 and obj2 are not equal")
  12. }

结果如下:

  1. obj1 and obj2 are not equal

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

注意:哈希值是一个长整数,它根据您使用的系统而变化,因此对于同一代码,您可能会得到不同的值。

使用哈希协议比较实例

  1. // conform Employee to Equatable
  2. struct Employee: Equatable {
  3. var name: String
  4. var salary: Int
  5. }
  6. // initialize two objects with different property values
  7. let obj1 = Employee(name: "Sabby", salary: 40000)
  8. let obj2 = Employee(name: "Sabby", salary: 40000)
  9. let obj3 = Employee(name: "Cathy", salary: 30000)
  10. // compare obj1 and obj2
  11. if obj1 == obj2 {
  12. print("obj1 and obj2 are equal")
  13. }
  14. else {
  15. print("obj1 and obj2 are not equal")
  16. }
  17. // compare obj1 and obj3
  18. if obj1 == obj3 {
  19. print("obj1 and obj3 are equal")
  20. }
  21. else {
  22. print("obj1 and obj3 are not equal")
  23. }

结果如下:

  1. obj1 and obj2 are equal
  2. obj1 and obj3 are not equal

在上面的实例中,我们创建了 3 个对象:Employee 结构的 obj1obj2obj3

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


Equatable 函数

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

然而,有时我们可能需要比较类型的选择特性。在这种情况下,我们可以在类型中使用 Equatable 函数。例如,

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

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

使用 Equatable 函数
  1. struct Employee: Equatable {
  2. var name: String
  3. var salary: Int
  4. // create a equatable function to only compare age property
  5. static func == (lhs: Employee, rhs: Employee) -> Bool {
  6. return lhs.salary == rhs.salary
  7. }
  8. }
  9. // initialize two objects with different values for name property
  10. let obj1 = Employee(name: "Sabby", salary: 34000)
  11. let obj2 = Employee(name: "Cathy", salary: 34000)
  12. // compare obj1 and obj2
  13. if obj1 == obj2 {
  14. print("obj1 and obj2 are equal")
  15. }
  16. else {
  17. print("obj1 and obj2 are not equal")
  18. }

结果如下:

  1. obj1 and obj2 are equal

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

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

在这里,ob1obj2salary 相同,因此执行 if 代码块。

如果我们为 salary 提供不同的值,那么 else 代码块就会被执行。