Swift枚举:不支持普通/不可用的初始化程序 - 或者只是破坏了?

时间:2015-02-22 01:31:16

标签: ios xcode swift enums xcode6

我已阅读有关Swift failable initializer's的文档,但没有看到关于正常,不可用的变种的任何明确说明。我是否遗漏了某些内容,或者对于具有原始值的枚举器不支持常规初始化程序,即使初始化程序不可能失败(因为初始化程序遵循默认值):

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)

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

1 个答案:

答案 0 :(得分:1)

这曾经用于Swift 1.1(Xcode 6.1.1),但在Swift 1.2(Xcode 6.3)中失败了。 这是一个在Apple开发者论坛中讨论过的错误:Swift 1.2 - Initializing Enums

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

let workaround1 = NameOfYourModule.NonFailableSeason(d: 0)

或者明确调用init方法:

let workaround2 = NonFailableSeason.init(d: 0)

更新:已在Xcode 6.3 beta 2(6D532l)版本中修复此问题。