Как реализовать сравнение значений Result

Добавьте условное Equatable-соответствие, когда сравнимы оба payload-типа. Также укажите оба generic-параметра при создании success/failure.

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

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

Добавьте условное 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.

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

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

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

Подробнее