Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;枚举大小写的原始值不唯一";对于具有浮点原始值的Swift枚举_Swift_Enums - Fatal编程技术网

&引用;枚举大小写的原始值不唯一";对于具有浮点原始值的Swift枚举

&引用;枚举大小写的原始值不唯一";对于具有浮点原始值的Swift枚举,swift,enums,Swift,Enums,根据,我应该能够使用“字符串、字符或任何整数或浮点数类型”的原始值创建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线上。它编

根据,我应该能够使用“字符串、字符或任何整数或浮点数类型”的原始值创建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?

它明确地说您可以,但不要在需要比较相等性的地方使用浮点值(尤其是
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
        }
    }
}
如果它们是基于
Int
,您可以利用其中的一些功能。

(从我上面的评论:)


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

更一般地说(正如@Sulthan所观察到的),如果枚举的比率 值是二的幂,例如
3.7/7.4
1.2/4.8
1.1/17.6
,但仅限于 如果两个值都有非零的小数部分。所以
1.5/3.0
1.25/5.0
不要
导致错误。

对我来说,这是有效的


我将空字符串分配给枚举中的多个大小写值。我改了。确保每个案例的值都是唯一的。

这看起来绝对像一个bug。如果一个枚举值正好等于“另一个枚举值的2倍”(但不是整数),则似乎会发生这种情况。你知道吗,你是对的。回答你的意见,我会接受的。(并提交一个radar.Sigh。)我想这可能与浮点的二进制表示有关。可能枚举的相等比较会截断一些位。雷达字段,rdar://18878723Now 在Swfit 2中,这不是一个错误。@Sulthan:你是对的,不仅是因素2导致了问题,而且还有4,8,16,…我给你的博客文章链接添加一个方法到枚举中,使用Int值索引到一个值数组中,这是实现我想要做的更好的方法。