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,因为 obj1obj2name 属性值不同。因此,执行 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 
}

ob1obj2 的 salary 相同,因此执行 if 块。

如果我们提供了不同的 salary 值,则会执行 else 块。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战