3
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:)吗?

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

4

3 回答 3

3

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

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

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

于 2017-06-11T20:07:31.517 回答
1

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

笔记:

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

例如:

let p1index = people.index(of: p1)

在这里,p1index 可以通过将其与 people 数组中的每个元素进行比较来查找,并通过将 p1 对象属性与people 数组中该特定索引处对象的属性进行比较来返回索引。

于 2017-06-11T20:14:20.750 回答
0

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

于 2020-12-21T05:13:51.100 回答