Использование перечислений для разработки типов ошибок в Swift

Может быть, я просто полностью обдумал это, но я пытаюсь использовать перечисления для обработки ошибок из API, с которым я интегрируюсь.

Из документации по этому API я вижу все возможные ответы, которые могут быть возвращены. Я выписал это как BaseError перечисление:

enum BaseError: Error {
    case badRequest // 400
    case unauthorized // 401
    case forbidden // 403
    case unhandledError // XXX
    ...
}

Теперь у моего клиента начинается моя проблема.

Моей первоначальной надеждой было взять это BaseError перечислять и расширять / добавлять дополнительные случаи в зависимости от того, в каком клиенте я нахожусь.

Что-то вроде:

enum ClientSpecificError: BaseError {
    case clientError
}

Что позволило бы мне вернуть ошибку, как ClientSpecificError.unauthorized


Теперь я знаю, что это невозможно, так как перечисления не могут наследовать другие перечисления, но мне не хватает некоторого понимания того, как мне это сделать.

Вопросы

Есть ли какой-то другой способ, которым я могу использовать enums для этого?

Это даже "лучшая практика"?

1 ответ

Решение

Вместо этого вы можете использовать связанные значения и сохранить ошибку низкого уровня в отдельном случае. Например:

enum ClientSpecificError: Error {
    case clientError
    case baseError(BaseError)
}

Документация Apple:

Однако иногда полезно иметь возможность хранить связанные значения других типов вместе с этими значениями случая. Это позволяет вам хранить дополнительную пользовательскую информацию вместе со значением регистра и разрешает изменять эту информацию каждый раз, когда вы используете этот регистр в своем коде.

Другие вопросы по тегам