web-dev-qa-db-ja.com

タイプ「エラー」はプロトコル「RawRepresentable」に準拠していません

遊び場のコードをSwift 3、Xcodeは変更を提案しました

enum Error: ErrorType {
    case NotFound
}

enum Error: Error {
    case NotFound
}

しかし、タイトルエラーが発生し、列挙型をそのプロトコルに準拠させる方法がわかりません。

10
Shades

問題は、エラータイプにErrorという名前を付けたことです。これは、標準ライブラリのErrorプロトコルと競合します(したがって、Swiftは循環参照があると見なします)。

明確にするために、Swift ErrorプロトコルをSwift.Errorと呼ぶことができます。

enum Error : Swift.Error {
    case NotFound
}

しかし、これは、モジュール内のErrorへの今後の参照は、Swift Errorプロトコル(再度明確にする必要があります)ではなく、yourErrorタイプを参照することを意味します) 。

したがって、これまでで最も簡単な解決策は、エラータイプの名前をよりわかりやすい名前に変更することです。

31
Hamish

このエラーは、Errorであるprotocolの既存の宣言を「オーバーライド」しているために発生します。したがって、「エラー」enumに別の(おそらくよりわかりやすい)名前を選択する必要があります。

2
Qbyte

列挙型を特定の名前で宣言しましたが、この問題も発生しました。

その理由は、私がRealmを使用していて、Errorクラスがあるため、Swift.ErrorRealmSwift.Errorが混同されているためです。

解決策は、宣言でRealmSwift.Errorを指定することです。

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

AVCaptureセッションでこのブロックを試しましたが、Swift 3 + iOS 10で動作します。NSErrorをRawValueとして使用すると、Hamishがエラーへの今後の参照に関して上記で参照していた内容に対処できる場合があります。

enum Error : Swift.Error {
    typealias RawValue = NSError

    case failedToAddInput
    case failedToAddOutput
    case failedToSetVideoOrientation
}
0
tymac

ファイルの先頭にimport Foundationを付けるのを忘れたため、このエラーが発生していました。他の誰かに役立つ場合に備えて共有するだけです。

0
Marc Renaud