Добавьте условное Equatable-соответствие, когда сравнимы оба payload-типа. Также укажите оба generic-параметра при создании success/failure.
Как реализовать сравнение значений Result
Добавьте условное Equatable-соответствие, когда сравнимы оба payload-типа. Также укажите оба generic-параметра при создании success/failure.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо изменить приведённый фрагмент кода так, чтобы стало возможным сравнивать экземпляры Result.
enum Result<Value, MyError> where MyError: Error {
case failure(MyError)
case success(Value)
}
let int1 = 1
let result: Result = .success(int1)
let error: Result = .failure(CustomError(""))
if result == result {
true
} else {
false
}
Ответ
Добавьте условное Equatable-соответствие, когда сравнимы оба payload-типа. Также укажите оба generic-параметра при создании success/failure.
Для собственного enum из условия достаточно синтеза:
extension Result: Equatable where Value: Equatable, MyError: Equatable {}
struct CustomError: Error, Equatable {
let message: String
init(_ message: String) { self.message = message }
}
let result: Result<Int, CustomError> = .success(1)
let error: Result<Int, CustomError> = .failure(CustomError(""))
print(result == result) // true
print(result == error) // false
Без явного контекста .success(1) не определяет тип ошибки, а .failure(...) — тип успешного значения. Сравниваются case и связанные данные. Не путайте пользовательский Result с одноимённым стандартным типом, который уже поддерживает условное Equatable.