Индекс (of:) и 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:)
?
Извините, что задали этот глупый вопрос.
3 ответа
Задайте себе вопрос: что делает index(of:)
делать точно?
Находит индекс указанного элемента в массиве. Правильно? Другими словами, он находит индекс первого элемента, который равен параметру.
Простая реализация для index(of:)
будет проходить через массив и на каждой итерации проверять, равен ли элемент параметру. Если это так, верните индекс. Как видите, это включает проверку, равны ли два объекта, поэтому Equatable
протокол не требуется.
indexOf(:) в этом случае требуется для подтверждения Equatable протокола.
НОТА:
- Так как indexOf(:) выполняет итерацию массива и сравнивает переданный вами объект с каждым элементом массива, который косвенно сравнивает и возвращает индекс совпадающего объекта.
Например:
let p1index = people.index(of: p1)
Здесь p1index может найти, сравнив его с каждым элементом в массиве людей, и вернуть индекс , сравнив свойства объекта p1, совпадающие со свойствами объекта в массиве людей по этому конкретному индексу.
вы можете использовать
class Person: NSObject
если вы не хотите добавлять дополнительные методы протокола.