【问题标题】:Type 'Error' does not conform to protocol 'RawRepresentable'类型“错误”不符合协议“RawRepresentable”
【发布时间】:2016-09-10 21:26:48
【问题描述】:

将我的 Playground 代码更改为 Swift 3,Xcode 建议更改

enum Error: ErrorType {
    case NotFound
}

enum Error: Error {
    case NotFound
}

但现在我收到标题错误,我不知道如何让枚举符合该协议。

【问题讨论】:

    标签: swift rawrepresentable


    【解决方案1】:

    问题是您将错误类型命名为 Error - 这与标准库 Error 协议冲突(因此 Swift 认为您有循环引用)。

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

    enum Error : Swift.Error {
        case NotFound
    }
    

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

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

    【讨论】:

    • 所以,在旧版本中,我无法命名我的枚举ErrorType,但现在Swift协议名称已更改为Error,我不能使用Error,对吧?
    • @Shades 是的,没错——如果您在构建设置(将使用 Swift 2.3)中将“使用旧版 Swift 语言版本”设置为“是”,您可以自己尝试一下。跨度>
    【解决方案2】:

    出现此错误是因为您“覆盖”了Error 的现有声明,即protocol。因此,您必须为“错误”enum 选择另一个(可能更具描述性)名称。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        我在 AVCapture 会话中尝试了这个块,它在 Swift 3 + iOS 10 中工作。使用 NSError 作为 RawValue 可能会解决 Hamish 上面提到的关于将来对 Error 的引用。

        enum Error : Swift.Error {
            typealias RawValue = NSError
        
            case failedToAddInput
            case failedToAddOutput
            case failedToSetVideoOrientation
        }
        

        【讨论】:

          【解决方案5】:

          我收到此错误是因为我忘记将import Foundation 放在文件顶部。只是分享以防万一它帮助别人。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-22
            • 1970-01-01
            相关资源
            最近更新 更多