Тип "Ошибка" не соответствует протоколу "RawRepresentable"

Изменив код моей игровой площадки на Swift 3, Xcode предложил изменить

enum Error: ErrorType {
    case NotFound
}

в

enum Error: Error {
    case NotFound
}

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

4 ответа

Решение

Проблема в том, что вы назвали свой тип ошибки Error - что противоречит стандартной библиотеке Error протокол (поэтому Свифт думает, что у вас есть круговая ссылка).

Вы могли бы обратиться к Swift Error протокол как Swift.Error для устранения неоднозначности:

enum Error : Swift.Error {
    case NotFound
}

Но это будет означать, что любые будущие ссылки на Error в вашем модуле будет ссылаться на ваш Error тип, а не Свифт Error протокол (вам придется снова устранить неоднозначность).

Поэтому самым простым решением на сегодняшний день было бы просто переименовать ваш тип ошибки во что-то более наглядное.

Эта ошибка возникает из-за того, что вы "переопределяете" существующее объявлениеError который является protocol, Таким образом, вы должны выбрать другое (возможно, более описательное) имя для вашей "ошибки" enum,

Я тоже получил эту проблему, хотя я объявил свой enum с конкретным именем.

Причина в том, что я использую Realm, и он имеет Error класс, который делает путаницу между Swift.Error а также RealmSwift.Error,

Решение указывает RealmSwift.Error в декларации.

// before
enum MyError: Error { ... }
// after
enum MyError: Swift.Error { ... }

Я попробовал этот блок в сеансе AVCapture, и он работает в Swift 3 + iOS 10. Использование NSError в качестве RawValue может решить проблему, на которую ссылался Хэмиш в отношении будущих ссылок на Error.

enum Error : Swift.Error {
    typealias RawValue = NSError

    case failedToAddInput
    case failedToAddOutput
    case failedToSetVideoOrientation
}

Я получаю эту ошибку, потому что я забыл поставить import Foundation в верхней части моего файла. Просто делиться на случай, если это кому-то поможет.

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