Extension удобно отделяет условное соответствие Equatable, но исходный пример содержит ошибки tuple-pattern и опечатку succes. Стандартный Swift.Result уже имеет такое соответствие.
Почему стоит реализовать протокол Equatable через расширение
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.