Swift 类型';错误';不符合协议';可表示的';

Swift 类型';错误';不符合协议';可表示的';,swift,rawrepresentable,Swift,Rawrepresentable,将我的游乐场代码更改为Swift 3,Xcode建议更改 enum Error: ErrorType { case NotFound } 到 但是现在我得到了标题错误,我不知道如何使枚举符合该协议。发生此错误是因为您正在“覆盖”现有的错误声明,该声明是协议。因此,您必须为“Error”enum选择另一个(可能更具描述性)名称。问题是,您已将错误类型命名为Error——这与标准库Error协议冲突(因此Swift认为您有一个循环引用) 您可以将SwiftError协议称为Swift.Er

将我的游乐场代码更改为Swift 3,Xcode建议更改

enum Error: ErrorType {
    case NotFound
}


但是现在我得到了标题错误,我不知道如何使枚举符合该协议。

发生此错误是因为您正在“覆盖”现有的
错误声明,该声明是
协议。因此,您必须为“Error”
enum

选择另一个(可能更具描述性)名称。问题是,您已将错误类型命名为
Error
——这与标准库
Error
协议冲突(因此Swift认为您有一个循环引用)

您可以将Swift
Error
协议称为
Swift.Error
,以消除歧义:

enum Error : Swift.Error {
    case NotFound
}
但这意味着,将来在模块中对
Error
的任何引用都将引用您的
Error
类型,而不是Swift
Error
协议(您必须再次消除歧义)


因此,到目前为止,最简单的解决方案是将错误类型重命名为更具描述性的类型。

我也遇到了这个问题,尽管我用特定的名称声明了我的枚举

原因是我使用的是Realm,它有
Error
类,这使得
Swift.Error
RealmSwift.Error
之间容易混淆

解决方案是在声明中指定
RealmSwift.Error

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

我在AVCapture会话中尝试了这个块,它在Swift 3+iOS 10中工作。使用NSError作为原始值可能会解决Hamish在上面提到的关于未来错误引用的问题

enum Error : Swift.Error {
    typealias RawValue = NSError

    case failedToAddInput
    case failedToAddOutput
    case failedToSetVideoOrientation
}

我收到这个错误是因为我忘了把
import-Foundation
放在文件的顶部。只是分享,以防对其他人有所帮助。

因此,在旧版本中,我无法命名我的枚举ErrorType,但现在Swift协议名称已更改为Error,我不能使用Error,对吗?@Shades是的,这是正确的–如果在构建设置中将“使用旧版Swift语言版本”改为“是”(将使用Swift 2.3),您可以自己尝试。
enum Error : Swift.Error {
    typealias RawValue = NSError

    case failedToAddInput
    case failedToAddOutput
    case failedToSetVideoOrientation
}