Xcode 分段错误:11与使用枚举扩展'Error'协议有关

Xcode 分段错误:11与使用枚举扩展'Error'协议有关,xcode,swift3,xcode8,Xcode,Swift3,Xcode8,在从Xcode 8 beta 3升级到Xcode 8 beta 4(8S188o)并执行通常的重命名迁移之后,我仍然看到9个或更多的构建错误被标记为分段错误:11 我注意到这些都与应用程序的错误扩展枚举有关。我构建了一个独立的测试项目,现在我可以用这段代码重新创建这个问题(所以你可以——把它放到任何项目中,观看烟花): 上面的代码使构建崩溃,但如果我做了下面的微小更改,构建就会正常工作: enum AppError { // Changed: don't conform to `Error`

在从Xcode 8 beta 3升级到Xcode 8 beta 4(8S188o)并执行通常的重命名迁移之后,我仍然看到9个或更多的构建错误被标记为
分段错误:11

我注意到这些都与应用程序的
错误
扩展枚举有关。我构建了一个独立的测试项目,现在我可以用这段代码重新创建这个问题(所以你可以——把它放到任何项目中,观看烟花):

上面的代码使构建崩溃,但如果我做了下面的微小更改,构建就会正常工作:

enum AppError { // Changed: don't conform to `Error`
当然,这对于我们的应用程序来说是不可接受的,因为我们希望抛出并捕获指定类型的错误对象

如果我使用结构或类,它也会修复它:

struct AppError: Error { // Changed: use a struct
但是我们在任何地方都打开错误类型并使用相关的值,所以这看起来像是一个巨大的重构。我认为,它也不太清楚地表达了我们试图建立的模型。如果这就是我要做的,我可能不得不去建造

我尝试过反复切换构建开关,进行干净的构建,退出并重新进入xcode,甚至升级到beta 5;但是没有用

  • 在最新的swift 3版本中,我用枚举扩展基
    Error
    类的模式是否有问题?(到目前为止工作得很好)

谢谢你的帮助

问题似乎是Swift不喜欢将错误枚举(作为函数参数的类型)四处传递

现在可以通过将AppError设置为结构来解决这个问题。经过一些思考,这可以在不严重丧失通用性的情况下实现

  • 这绝对是一个挑战
  • 此错误是将方法公开给Objective-C的一部分,因此您可以通过添加
    @nonobjc
    (谢谢@JordanRose!)来解决此问题:
  • 例如:


    文件
    MenuDisplayer.swift
    中在线
    161
    的内容似乎是Xcode中的一个bug;如果有可能的话,不妨试试7.3.1,看看问题是否依然存在。在这种情况下,我可能会尝试更改您的协议,使用兼容类型和实例方法来调用类中的函数-一个基本示例如下:以27787072的身份提交给apple radar好的,我想我知道该怎么做了。见下面我的答案。(顺便说一句,这是一个非常好的bug。我建议你也提交到bugs.swift.org。如果你需要我帮你做的话,请告诉我。)Bummer。我们有大量的应用程序代码,
    在给定的错误上切换
    es。有什么办法吗?也许我在错误结构中放了一个枚举。就是这么多的重构。有些情况下有相关的值,如
    .notFound(id:Int)
    我可以为
    结构
    类型实现
    可切换
    一致性吗?太棒了。谢谢你的回复。我告诉过你向金丝燕提交是个好主意![咆哮]为什么没有很多人投票支持你的问题?你出色地提出了这个问题!如果每个人在提出堆栈溢出问题之前都做了这么多准备工作,这将是一个光明美丽的世界!!好了,我现在冷静下来了…谢谢你建议这条路线,马特。苹果漏洞报告(没有透明度,标记为重复)让我非常沮丧,我几乎没有。尽管如此,快速的bug报告还是很棒的。:)我知道这就是你会发现的!
    struct AppError: Error { // Changed: use a struct
    
    enum AppError: Error {
      case one
      case two
    }
    
    class ViewController: UIViewController, ErrorReceiver {
      @nonobjc
      func thingError(with error: AppError) {
        print(error)
      }
    }