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
。
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
。