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:)
有什么关系吗?
很抱歉提出这个愚蠢的问题。
答案 0 :(得分:1)
问问自己:index(of:)
到底做了什么?
它找到数组中指定元素的索引。对?换句话说,它找到第一个元素的索引,它等于参数。
index(of:)
的一个简单实现是循环遍历数组,并在每次迭代中检查元素是否等于参数。如果是,则返回索引。如您所见,这涉及检查两个对象是否相等,因此需要Equatable
协议。
答案 1 :(得分:1)
indexOf(:)在这种情况下,需要确认Equatable协议。
注:
例如:
let p1index = people.index(of: p1)
在这里,p1index可以通过将它与people数组中的每个元素进行比较来找到,并通过比较p1对象的属性匹配 与 >该特定索引处的人员数组中对象的属性。
答案 2 :(得分:0)
如果您不想添加其他协议方法,可以使用 class Person: NSObject
。