分段错误:11与用枚举扩展“错误”协议有关



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

我注意到这些都与应用程序的Error扩展枚举有关。我构建了一个独立的测试项目,现在我可以只使用以下代码重新创建这个问题(因此您可以将此代码放入任何项目中并观看烟花):

enum AppError: Error {
  case one
  case two
}
protocol ErrorReceiver {
  func thingError(with: AppError)
}
class ViewController: UIViewController, ErrorReceiver {
  func thingError(with error: AppError) {
    print(error)
  }
}

上面的代码会使构建崩溃,但是如果我在下面做一些微小的改变,构建就会正常工作:

enum AppError { // Changed: don't conform to `Error`

当然,这对于我们的应用程序来说是不可接受的,因为我们希望抛出和捕获我们指定类型的Error对象。

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

struct AppError: Error { // Changed: use a struct

但是我们在所有地方都打开了错误类型并使用相关值,所以这看起来像是一个巨大的重构。我认为,这也不太清楚地代表了我们试图建立的模型。如果这是我必须做的构建,我可能不得不。

我试过把构建开关关掉再打开,做干净的构建,退出和重新进入xcode,甚至升级到beta 5;但无济于事。

  • 在最新的swift 3构建中扩展基础Error类的模式是否有问题?(到目前为止工作很好)

谢谢你的帮助!

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

现在可以通过将AppError设置为一个结构体来解决这个问题。只要稍微考虑一下,就可以在不严重损失通用性的情况下做到这一点。

  1. 这个错误发生作为暴露方法的一部分Objective-C,所以你可以通过添加@nonobjc(感谢@JordanRose!):

,

enum AppError: Error {
  case one
  case two
}
class ViewController: UIViewController, ErrorReceiver {
  @nonobjc
  func thingError(with error: AppError) {
    print(error)
  }
}

相关内容

最新更新