Index(of:) 和 Equatable 协议

Index(of:) and Equatable Protocol

class Person: Equatable {
var name: String
var age: Int

init(name: String, age: Int) {
    self.name = name
    self.age = age
}
static func ==(lhs: Person, rhs: Person) -> Bool {
    return (lhs.name == rhs.name) && (lhs.age == rhs.age)
}
}
let p1 = Person(name: "David", age: 29)
let p2 = Person (name: "John", age: 28)

var people = [Person]()
people.append(p1)
people.append(p2)

let p1index = people.index(of: p1)
let p2index = people.index(of: p2)

为了使用 index(of:),我需要使 Person 符合 Equatable 协议。据我所知,Equatable 协议允许比较 2 个实例是否相等。查找索引和比较是否相等之间有什么关系?为什么我必须遵守 Equatable 协议才能使用 index(of:)?

要采用 Equatable 协议,我必须将 (==) 运算符实现为静态方法:

static func ==(lhs: Person, rhs: Person) -> Bool {
    return (lhs.name == rhs.name) && (lhs.age == rhs.age)
}

我在这里没有比较任何 Person 实例的相等性,为什么我还需要 return (lhs.name == rhs.name) && (lhs.age == rhs.age)?它是做什么用的?跟index(of:)有关系吗?

抱歉问了这个愚蠢的问题。

问问自己:index(of:) 到底做了什么?

查找指定元素在数组中的索引。正确的?换句话说,它找到等于参数的第一个元素的索引。

index(of:) 的一个简单实现是遍历数组并在每次迭代中检查元素是否等于参数。如果是,return 索引。可以看到,这涉及到检查两个对象是否相等,所以需要Equatable协议。

indexOf(:) in this case, required to confirm Equatable protocol.

注意:

  • 作为 indexOf(:) 迭代数组并将传递的对象与数组中的每个元素进行比较,间接比较和 returning 匹配对象的索引。

例如:

let p1index = people.index(of: p1)

在这里,p1index 可以通过将它与 people 数组中的每个元素进行比较来找到 return 索引 通过比较 p1 对象的属性 匹配 具有 people 数组 中对象的 属性。

如果不想添加额外的协议方法,可以使用class Person: NSObject