Что такое протокол Equatable в Swift и для чего он нужен?

«Что такое протокол Equatable в Swift и для чего он нужен?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 оператор == для вашего типа не будет работать, а многие полезные методы коллекций окажутся недоступными. Автоматический синтез для структур и перечислений значительно сокращает объем шаблонного кода.