Kotlin:像Swift这样的价值实例化枚举

时间:2018-12-17 19:57:33

标签: swift kotlin enums

嘿,我想用一个值来实例化一个新的枚举:

我的枚举:

enum class DirectionSwiped(raw: Int){
    LEFT(4),
    RIGHT(8);
}

我想像这样实例化新的枚举:

val direction = DirectionSwiped(raw: 4)

但我收到此错误:

  

不能实例化枚举类型

为什么?这是一个基本功能。

迅速:

enum Direction: Int{
    case right = 2
}

实例化如下:

let direction = Direction(rawValue: 2)

2 个答案:

答案 0 :(得分:3)

是的

enum class DirectionSwiped(val raw: Int){
    LEFT(4),
    RIGHT(8);
}

val left = DirectionSwiped.LEFT
val right = DirectionSwiped.RIGHT

val leftRaw = DirectionSwiped.LEFT.raw
val rightRaw = DirectionSwiped.LEFT.raw

val fromRaw = DirectionSwiped.values().firstOrNull { it.raw == 5 }

这是访问enum class实例的正确方法

您要尝试的是在定义站点外部创建一个新实例,这对于enumsealed类是不可能的,这就是为什么错误指出构造函数为 private < / strong>

答案 1 :(得分:1)

如错误所示,您无法在Kotlin中实例化枚举。可能的解决方法是使用映射和2个辅助方法从原始值获取枚举值,反之亦然:

enum class DirectionSwiped {
    LEFT,
    RIGHT;

    fun toRaw() = enumToRaw[this]
    companion object {
        val rawToEnum = mapOf(
                4 to LEFT,
                8 to RIGHT
        )
        val enumToRaw = rawToEnum.entries.associate{(k,v)-> v to k}
        fun ofRaw(raw: Int): DirectionSwiped? = rawToEnum[raw]
    }
}

用法:

val direction = DirectionSwiped.ofRaw(4) // LEFT
val raw = DirectionSwiped.LEFT.toRaw() // 4