"枚举案例的原始值不是唯一的"对于带有Float原始值的Swift枚举

时间:2014-11-04 16:12:35

标签: swift enums

根据The Swift Programming Language,我应该能够创建一个Swift枚举,其原始值为"字符串,字符或任何整数或浮点数类型"。但是当我尝试:

enum BatteryVoltage: Float {
    case v3v7 = 3.7
    case v5v0 = 5.0
    case v7v4 = 7.4
    case v11v1 = 11.1
    case v12v0 = 12.0
}

...我收到编译错误:

Raw value for enum case is not unique
在v7v4上。它被编译好了。但啊,它看起来很独特。如果我将值设置为7.41,或7.3或其他值,则编译正常。发生了什么事? Swift bug?

3 个答案:

答案 0 :(得分:9)

它肯定会说你可以,但不要使用浮点值(尤其是Float),你需要比较相等 - 精度并不能保证足够好。除非出于兼容性原因绝对需要使用Double,否则请始终使用Float

在这种情况下,它似乎遇到了麻烦,因为(a)第三种情况是第一种情况的2倍,(b)其他一些我不知道的因素。使用3.3/6.63.4/6.83.6/7.2也给了我这个问题,但3.5/7.0却没有。但是,我可以通过将最后一个案例更改为22.2(2x 11.1)来显示它。

这是一种解决方法 - 使用典型的基于Int的枚举,并提供doubleValue属性:

enum BatteryVoltage: Int {
    case v3v7
    case v5v0
    case v7v4
    case v11v1
    case v12v0

    var doubleValue: Double {
        switch self {
        case .v3v7: return 3.7
        case .v5v0: return 5.0
        case .v7v4: return 7.4
        case .v11v1: return 11.1
        case .v12v0: return 12.0
        }
    }
}

如果Int基于{{1}},您可以利用一些nice additional features of enums

答案 1 :(得分:4)

(来自我上面的评论:)

看起来绝对像一个bug。如果一个枚举值完全等于“2倍于另一个枚举值”,但似乎不等于整数,则会发生这种情况。

更一般地说(如@Sulthan观察到的)如果枚举的比例发生错误 值是两个的幂,例如3.7/7.41.2/4.81.1/17.6,但 如果两个值都具有非零小数部分。因此1.5/3.01.25/5.0不会 导致错误。

答案 2 :(得分:0)

对我来说这是可行的。

我正在为枚举中的多个case值分配空字符串。我改变了。确保每个case值都是唯一的。