微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

根据 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?

解决方法

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

在这种情况下,它似乎有麻烦,因为(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的,你可以利用nice additional features of enums.

原文地址:https://www.jb51.cc/css/215212.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。