Ответ
Equatable — это протокол в Swift, который позволяет сравнивать экземпляры типа на равенство с помощью оператора ==. Его реализация требуется, когда необходимо проверить, содержат ли два объекта одинаковые значения.
Основное назначение:
- Сравнение пользовательских типов (структур, классов, перечислений).
- Использование типов в функциях стандартной библиотеки, которые требуют проверки на равенство (например,
contains(_:),firstIndex(of:),remove(_:)для коллекций).
Пример реализации для структуры:
struct Book: Equatable {
let isbn: String
let title: String
let pageCount: Int
}
// Для структур, где все свойства соответствуют Equatable,
// компилятор автоматически генерирует реализацию `==`.
let book1 = Book(isbn: "123", title: "Swift Basics", pageCount: 300)
let book2 = Book(isbn: "123", title: "Swift Basics", pageCount: 300)
let book3 = Book(isbn: "456", title: "Advanced Swift", pageCount: 500)
print(book1 == book2) // true (сравниваются ВСЕ свойства)
print(book1 == book3) // false
// Использование в коллекциях
let library = [book1, book3]
print(library.contains(book2)) // true
Пример кастомной реализации (например, для класса):
class Employee: Equatable {
let employeeID: Int
let name: String
init(id: Int, name: String) {
self.employeeID = id
self.name = name
}
// Требуется ручная реализация статической функции `==`
static func == (lhs: Employee, rhs: Employee) -> Bool {
// Сравниваем только по уникальному ID
return lhs.employeeID == rhs.employeeID
}
}
let emp1 = Employee(id: 101, name: "Алиса")
let emp2 = Employee(id: 101, name: "Алисия") // Имя другое
print(emp1 == emp2) // true, потому что employeeID совпадает
Почему это важно: Без соответствия Equatable оператор == для вашего типа не будет работать, а многие полезные методы коллекций окажутся недоступными. Автоматический синтез для структур и перечислений значительно сокращает объем шаблонного кода.