Индекс (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если вы не хотите добавлять дополнительные методы протокола.

Другие вопросы по тегам