Swift枚举:正常/不可破坏的初始化不支持 – 或只是破碎?

我已经阅读了关于Swift的failable初始化程序的文档,但没有看到任何关于正常的,不可分类的变种的明确信息。 我是否错过了一些东西,或者是普通初始值设定项不支持具有原始值的枚举值,即使初始值设定项没有可能失败(因为初始值设定项默认为默认值):

enum FailableSeason : Int { init?(d: Int) { switch (d % 365) { case 60...151: self = .Spring case 152...243: self = .Summer case 244...334: self = .Fall // default provided, guaranteed to be valid default: self = .Winter } } case Spring case Summer case Fall case Winter } enum ImplicitlyUnwrappedFailableSeason : Int { init!(d: Int) { switch (d % 365) { case 60...151: self = .Spring case 152...243: self = .Summer case 244...334: self = .Fall // default provided, guaranteed to be valid default: self = .Winter } } case Spring case Summer case Fall case Winter } enum NonFailableSeason : Int { init(d: Int) { switch (d % 365) { case 60...151: self = .Spring case 152...243: self = .Summer case 244...334: self = .Fall // default provided, guaranteed to be valid default: self = .Winter } } case Spring case Summer case Fall case Winter } let thisWorks = FailableSeason(d: 60) let thisFails = ImplicitlyUnwrappedFailableSeason(d: 60) let andThisFails = NonFailableSeason(d: 0) 

请注意,我将其分解为单独的枚举以确保它不是冲突初始化程序的问题。

这用于Swift 1.1(Xcode 6.1.1),但在Swift 1.2(Xcode 6.3)中失败。 这是一个在苹果开发者论坛讨论过的bug: Swift 1.2 – 初始化枚举 。

在讨论中给出了两个解决方法:使用模块/应用程序名称作为前缀:

 let workaround1 = NameOfYourModule.NonFailableSeason(d: 0) 

或者明确地调用init方法:

 let workaround2 = NonFailableSeason.init(d: 0) 

更新:这已在Xcode 6.3 beta 2(6D532l)版本中得到修复。