Протокол Equatable это тип, который позволяет сравнить значения на равность. Для сравнения используется оператор (==). Большинство базовых типов Swift уже подписаны под протокол Equatable, перейдите по ссылке, чтобы посмотреть весь список.
Как подписать свой тип под Equatable
Чтобы подписать свой кастомный тип под Equatable необходимо поставить двоеточие (:) после названия своего типа и прописать Equatable. Ниже пример:
struct CompanyEmployee: Equatable
У данного протокола есть один обязательный метод.
static func == (lhs: Self, rhs: Self) -> Bool
Статичная функция с параметрами left-hand side (lhs) с типом Self и right-hand side (rhs), которая возвращает булево значение. В нашем примере CompanyEmployee.
struct CompanyEmployee: Equatable {
let name: String
let lastName: String
let position: String
let workingHours: Int
let hasScoot: Bool
let isEmployee: Bool
static func == (lhs: CompanyEmployee, rhs: CompanyEmployee) -> Bool {
lhs.hasScoot == rhs.hasScoot && lhs.isEmployee == rhs.isEmployee
}
}
Выше мы сравниваем свойства hasScoot && isEmployee. То есть мы ставим условие, что любой, кто является частью компании должен иметь скут и являться сотрудником. Теперь на основе этой структуры создаем два экземпляра.
let employeeOne = CompanyEmployee(name: "David",
lastName: "Lee",
position: "Marketing Specialist",
workingHours: 40,
hasScoot: true,
isEmployee: true)
let employeeTwo = CompanyEmployee(name: "John",
lastName: "Wick",
position: "Security guard",
workingHours: 20,
hasScoot: false,
isEmployee: false)
Давайте попробуем сравнить являются ли эти двое сотрудниками компании.
if employeeOne == employeeTwo {
print("(employeeOne.name) and (employeeTwo.name) are employees of this company")
} else {
print("Alarm! (employeeTwo.name) came after his revenge")
}
Получаем следующий print на console.
Alarm! John came after his revenge
Так как в нашей модели условием для схожести является наличие скута и явлением сотрудника, а у employeeTwo свойства hasScoot: false, isEmployee: false на консоль мы получаем сообщение о том, что Джон пришел мстить.
Давайте поменяем упомянутые выше свойства на true. Теперь же в консоли мы получаем другое сообщение.
David and John are employees of this company.
Поменяв значения hasScoot && isEmployee на true у employeeTwo, мы говорим, что Джон является сотрудником и у него есть скут, следовательно он удовлетворяет условия протокола.