【问题标题】:using initializer in enum and assign to self在枚举中使用初始化器并分配给 self
【发布时间】:2016-08-25 12:31:36
【问题描述】:

我的代码:

enum Grade: String{
    case A, B, C, D, E, F, U, S
    init!(_ result: Int){
        if result > 100 {
            return nil
        }
        switch result {
        case 0:
            self = .U
        case 1...49:
            self = .F
        case 0:
            self = .U
        case 50...59:
            self = .E
        case 60...69:
            self = .D
        case 70...79:
            self = .C
        case 80...89:
            self = .B
        case 90...99:
            self = .A
        case 100:
            self = .S
        default:
            break
        }
    }
}

看起来不错,但我出错了。

错误:在所有存储的属性初始化之前使用了“self”。

我修复它的方法是在初始化程序中为 self 分配一些东西,然后使用 switch。

我想知道是否有更好的解决方案?

谢谢。

【问题讨论】:

标签: swift


【解决方案1】:

您收到该错误是因为 您没有在“默认”情况下定义 self

要删除错误,请定义另一种情况(例如 .None)并将其置于“默认”状态。或者您可以创建可失败的初始化程序(init?),然后在默认情况下将 self 定义为 nil。

【讨论】:

  • 更广泛地说,如果在 switch 语句的一种情况下您跳过属性初始化(在我们的例子中为self),则该属性保持未初始化
【解决方案2】:

错误是因为您没有在default 语句中指定返回值。你的也是init!,这对我来说毫无意义。

试试这个:

enum Grade: String {
    case A, B, C, D, E, F, U, S

    init?(_ result: Int){
        guard 0...100 ~= result else {
            return nil
        }

        switch result {
        case 0:
            self = .U
        case 1...49:
            self = .F
        case 50...59:
            self = .E
        case 60...69:
            self = .D
        case 70...79:
            self = .C
        case 80...89:
            self = .B
        case 90...99:
            self = .A
        case 100:
            self = .S
        default:
            return nil
        }
    }
}

您可以通过将低于 0 的分数视为 0 并将高于 100 的分数视为 100 来使其不可为空:

enum Grade: String {
    case A, B, C, D, E, F, U, S

    init (_ result: Int) {
        switch result {
        case Int.min...0:
            self = .U
        case 1...49:
            self = .F
        case 50...59:
            self = .E
        case 60...69:
            self = .D
        case 70...79:
            self = .C
        case 80...89:
            self = .B
        case 90...99:
            self = .A
        case 100..<Int.max: // 100...Int.max is a bug in Swift 2, fixed in Swift 3
            self = .S
        default:
            self = .U // Even though all the cases above are exhaustive, the compiler
                      // does not know that. Hence, we still need a default, but it
                      // will never be reached
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多