#enums #kotlin
#перечисления #kotlin
Вопрос:
Я хотел бы получить такое же поведение, как у cpp:
enum dxgi_format_gli
{
DXGI_FORMAT_R64_UINT_GLI = 1,
DXGI_FORMAT_R64_SINT_GLI
}
где DXGI_FORMAT_R64_UINT_GLI
получает 1, а следующий получает 2
самое близкое, что у меня есть:
private var counter: Int = 2;
enum class dxgi_format_gli(i: Int = counter ) {
DXGI_FORMAT_R64_UINT_GLI(1),
DXGI_FORMAT_R64_SINT_GLI()
}
Однако я бы хотел, чтобы оно, конечно, было динамическим, то есть всякий раз, когда я вызываю конструктор с параметром, сохраняю его, counter
и все следующие конструкторы увеличивают и получают его..
Я уже сделал это на java:
public enum Dxgi_format_gli {
DXGI_FORMAT_R64_UINT_GLI(1),
DXGI_FORMAT_R64_SINT_GLI;
public final int value;
private static class Counter {
private static short value = 0;
}
private Dxgi_format_gli() {
value = Counter.value;
Counter.value ;
}
private Dxgi_format_gli(int value) {
this.value = value;
Counter.value ;
}
}
Но я не делал этого с помощью Kotlin..
Ответ №1:
У каждого enum
уже есть автоматически сгенерированное свойство ordinal
:
enum class A {a, b, c}
A.a.ordinal // 0
A.b.ordinal // 1
A.c.ordinal // 2
Итак, технически самый простой способ получить то, что вы хотите dxgi_format_gli.DXGI_FORMAT_R64_UINT_GLI.ordinal 1
(я понятия не имею, почему вы не хотите начинать с 0
0_o)
Вы можете заменить код в ответе @griffio на это:
enum class Dxgi_format_gli {
DXGI_FORMAT_R64_UINT_GLI,
DXGI_FORMAT_R64_SINT_GLI;
val value = ordinal 1
}
Комментарии:
1. Спасибо за ваш ответ, однако я не начинаю с
0
того, что это cpp-код, который я переношу (кстати, есть объяснение)2. Классное предложение
val value = ordinal 1
voddan, 1:p
Ответ №2:
Я думаю, вам просто нужно установить значение и переместить приращение, чтобы оно работало — чтобы начальный счетчик и значение были одинаковыми.
enum class Dxgi_format_gli {
DXGI_FORMAT_R64_UINT_GLI(1),
DXGI_FORMAT_R64_SINT_GLI;
val value: Int
private object Counter {
var value: Int = 0
}
constructor() {
Counter.value
value = Counter.value.toInt()
}
private constructor(value: Int) {
this.value = value
Counter.value = value
}
}
Комментарии:
1. Очень круто! Вы эмулировали лучшую функцию C ! Смотрите мой ответ для короткого пути.