Как стать автором
Обновить

Протокол Equatable в Swift

Протокол 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, мы говорим, что Джон является сотрудником и у него есть скут, следовательно он удовлетворяет условия протокола.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.