从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设置为一个结构体来解决这个问题。只要稍微考虑一下,就可以在不严重损失通用性的情况下做到这一点。
- 这个错误发生作为暴露方法的一部分Objective-C,所以你可以通过添加
@nonobjc
(感谢@JordanRose!):
,
enum AppError: Error {
case one
case two
}
class ViewController: UIViewController, ErrorReceiver {
@nonobjc
func thingError(with error: AppError) {
print(error)
}
}