索引(of :)和Equatable Protocol

时间:2017-06-11 19:57:16

标签: swift indexof equatable

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:)有什么关系吗?

很抱歉提出这个愚蠢的问题。

3 个答案:

答案 0 :(得分:1)

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

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

index(of:)的一个简单实现是循环遍历数组,并在每次迭代中检查元素是否等于参数。如果是,则返回索引。如您所见,这涉及检查两个对象是否相等,因此需要Equatable协议。

答案 1 :(得分:1)

  

indexOf(:)在这种情况下,需要确认Equatable协议。

注:

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

例如:

let p1index = people.index(of: p1)

在这里,p1index可以通过将它与people数组中的每个元素进行比较来找到,并通过比较p1对象的属性匹配 >该特定索引处的人员数组中对象的属性

答案 2 :(得分:0)

如果您不想添加其他协议方法,可以使用 class Person: NSObject