Обработчик кастомных ошибок — enum + LocalizedError

swift

#1

Цель: создать enum с кейсами всех возможных ошибок и добавить описание, которое может отсутствовать (в этом случае нужно вернуть имя кейса)

Сначала просто создаю перечисления:

enum AppErrors {
	case noToken // отсутствует токен
	case noMoney(moneyNeeded: Int) // не хватает N валюты
	
	// Работа с файлами
	case parse(fileName: String) // Не удалось распарсить файл
	
	// ... и другие ошибки
}

Далее расширяю протоколом LocalizedError:

extension AppErrors: LocalizedError {
	var errorDescription: String? {
		switch self {
			case .noToken: return "Отсутствует токен"
			case .noMoney(moneyNeeded: let money): return "не хватает \(money) валюты"
			
			default: return self.rawValue // ERROR: Value of type 'AppErrors' has no member 'rawValue'
		}
	}
}

Строка с default возвращает ошибку. Логично: AppErrors не подписан под String. Однако, если это сделать, то появляется другая ошибка:

Подскажите пожалуйста, в какую сторону двигаться, чтоб реализовать задуманное? Или может я вообще не так делаю?


#2

А зачем вам String? ___


#3

Чтоб в строке с “default: return self.rawValue” иметь доступ к свойству “rawValue”, которое в свою очередь нужно, чтоб в случае отсутствия описания я мог получить хотя бы название (case) ошибки.


Как вариант, можно через RawRepresentable:

extension AppErrors: RawRepresentable {
    public typealias RawValue = String

    public init?(rawValue: RawValue) {
        return nil
    }

    var rawValue: RawValue {
        switch self {
			case .noToken: return "noToken"
			case .noMoney: return "noMoney"
			case .fileNotFound: return "fileNotFound"
		}
    }
}

Но это, по-моему, уже скорее избыточность кода. Проще уж сразу создать описание ошибки.


#4

Хм… Мне казалось, что вопрос далеко не специфичный. А в теме почему-то тишина.
Неужели я пытаюсь создать что-то невозможное?


#5

Да___________________


#6

Вы создаете енум с ошибками, но не всем добавляете описание. Какой в этом смысл?
Либо убирайте ошибку без описания, либо делайте описание всем ошибкам.