web-dev-qa-db-ja.com

Kotlinで列挙型の変数を宣言するにはどうすればよいですか?

ドキュメント によると、enumクラスが作成されました

enum class BitCount public constructor(val value : Int)
{
  x32(32),
  x64(64)
}

次に、いくつかの関数で変数を宣言しようとしています

val bitCount : BitCount = BitCount(32)

しかし、コンパイルエラーがあります

BitCount型の変数を宣言し、Intから初期化するにはどうすればよいですか?

エラー:(18、29)Kotlin:列挙型をインスタンス化できません

22
Ed.ward

他の回答で述べたように、名前で存在するenumの任意の値を参照できますが、新しい値を作成することはできません。それはあなたがしようとしていたことに似た何かをすることを妨げるものではありません...

_// wrong, it is a sealed hierarchy, you cannot create random instances
val bitCount : BitCount = BitCount(32)

// correct (assuming you add the code below)
val bitCount = BitCount.from(32)
_

数値_32_に基づいてenumのインスタンスを検索する場合は、次の方法で値をスキャンできます。 _companion object_およびfrom()関数を使用してenumを作成します。

_enum class BitCount(val value : Int)
{
    x16(16),
    x32(32),
    x64(64);

    companion object {
        fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue }
    }
}
_

次に、関数を呼び出して、一致する既存のインスタンスを取得します。

_val bits = BitCount.from(32) // results in BitCount.x32
_

素敵できれい。または、この場合、2つの間に予測可能な関係があるため、数値からenum値の名前を作成し、BitCount.valueOf()を使用できます。これは、コンパニオンオブジェクト内の新しいfrom()関数です。

_fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")
_
49
Jayson Minard

列挙インスタンスは、列挙クラス宣言内でのみ宣言できます。

新しいBitCountを作成する場合は、次のように追加します。

enum class BitCount public constructor(val value : Int)
{
    x16(16),
    x32(32),
    x64(64)
}

どこでもBitCount.x16として使用します。

13
user2235698

どうですか:

enum class BitCount constructor(val value : Int)
{
    x32(32),
    x64(64);

    companion object {
         operator fun invoke(rawValue: Int) = BitCount.values().find { it.rawValue == rawValue }
    }
}

その後、提案したように使用できます。

val bitCount = BitCount(32)

そして、enumの場合に値が見つからない場合はnullを返します

2