&引用;枚举大小写的原始值不唯一";对于具有浮点原始值的Swift枚举
根据,我应该能够使用“字符串、字符或任何整数或浮点数类型”的原始值创建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线上。它编
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
(2x11.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值索引到一个值数组中,这是实现我想要做的更好的方法。