ドキュメント によると、enumクラスが作成されました
enum class BitCount public constructor(val value : Int)
{
x32(32),
x64(64)
}
次に、いくつかの関数で変数を宣言しようとしています
val bitCount : BitCount = BitCount(32)
しかし、コンパイルエラーがあります
BitCount型の変数を宣言し、Int
から初期化するにはどうすればよいですか?
エラー:(18、29)Kotlin:列挙型をインスタンス化できません
他の回答で述べたように、名前で存在する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")
_
列挙インスタンスは、列挙クラス宣言内でのみ宣言できます。
新しいBitCountを作成する場合は、次のように追加します。
enum class BitCount public constructor(val value : Int)
{
x16(16),
x32(32),
x64(64)
}
どこでもBitCount.x16
として使用します。
どうですか:
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を返します