Почему стоит реализовать протокол Equatable через расширение

Extension удобно отделяет условное соответствие Equatable, но исходный пример содержит ошибки tuple-pattern и опечатку succes. Стандартный Swift.Result уже имеет такое соответствие.

Короткий ответ

Что ответить на собеседовании

Extension удобно отделяет условное соответствие Equatable, но исходный пример содержит ошибки tuple-pattern и опечатку succes. Стандартный Swift.Result уже имеет такое соответствие.

Подробный разбор

Ответ с пояснениями

Условие

В Swift часто требуется, чтобы типы могли сравниваться на равенство. Одним из удобных способов добавить такое поведение является объявление соответствия протоколу Equatable в extension. При этом можно задать условие, при котором тип будет соответствовать протоколу только если его параметры тоже поддерживают Equatable. Ниже показан пример, где Result получает автоматическую реализацию оператора ==, если и тип Value, и тип Error являются сравнимыми.

extension Result: Equatable where Value: Equatable, Error: Equatable {
    static func == (lhs: Result, rhs: Result) -> Bool {
        switch (lhs, rhs) {
        case .success(let lhsVal), .succes(let rhsVal):
            return lhsVal == rhsVal
        case .failure(let lhsVal), .failure(let rhsVal):
            return lhsVal == rhsVal
        default:
            return false
        }
    }
}

Ответ

Extension удобно отделяет условное соответствие Equatable, но исходный пример содержит ошибки tuple-pattern и опечатку succes. Стандартный Swift.Result уже имеет такое соответствие.

Для собственного типа пример можно записать без конфликта со стандартной библиотекой:

enum MyResult<Value, Failure> {
    case success(Value)
    case failure(Failure)
}
extension MyResult: Equatable where Value: Equatable, Failure: Equatable {
    static func == (lhs: Self, rhs: Self) -> Bool {
        switch (lhs, rhs) {
        case let (.success(a), .success(b)): return a == b
        case let (.failure(a), .failure(b)): return a == b
        default: return false
        }
    }
}

Условие where делает сравнение доступным только при сравнимых payload-типах. Для такого enum компилятор также может синтезировать Equatable, поэтому явный оператор нужен лишь для учебной демонстрации или особой семантики. Не добавляйте повторное соответствие стандартному Result.

Источник: github.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее