对于具有Float原始值的Swift枚举,"enum case的原始值不是唯一的"

Rob*_*ins 8 enums swift

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

enum BatteryVoltage: Float {
    case v3v7 = 3.7
    case v5v0 = 5.0
    case v7v4 = 7.4
    case v11v1 = 11.1
    case v12v0 = 12.0
}
Run Code Online (Sandbox Code Playgroud)

...我收到编译错误:

Raw value for enum case is not unique
Run Code Online (Sandbox Code Playgroud)

在v7v4线上.它被编译好了.但啊,它看起来很独特.如果我将值设置为7.41,或7.3或其他值,则编译正常.这是怎么回事?Swift bug?

Nat*_*ook 9

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

在这种情况下,它似乎有麻烦,因为(a)第三种情况是第一种情况的2倍,(b)我不知道的其他因素.使用3.3/6.6,3.4/6.8并且3.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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果它们是基于的,你可以利用它们的一些很好的附加功能Int.


Mar*_*n R 5

(来自我上面的评论:)

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

更一般地(如 @Sulthan 观察到的),如果枚举值的比率是2 的幂,例如3.7/7.41.2/4.81.1/17.6,但 当两个值都具有非零小数部分时,才会发生错误。所以1.5/3.0还是1.25/5.0不会引起错误。