2016-10-09 3 views
1

Ich mag würde das gleiche Verhalten wie cpp erhalten:Wie kann ich Kotlin Enum gleiche Verhalten wie cpp diejenigen

enum dxgi_format_gli 
{ 
    DXGI_FORMAT_R64_UINT_GLI = 1, 
    DXGI_FORMAT_R64_SINT_GLI 
} 

wo DXGI_FORMAT_R64_UINT_GLI 1 erhält, und der nächste bekommt 2

in der Nähe Ich habe ist:

private var counter: Int = 2; 

enum class dxgi_format_gli(i: Int = counter++) { 

    DXGI_FORMAT_R64_UINT_GLI(1), 
    DXGI_FORMAT_R64_SINT_GLI() 
} 

aber ich möchte, natürlich, dynamisch sein, das heißt, wenn ich den Konstruktor mit einem Parameter aufrufen, dass man in counter und alle folgenden konst speichern ructors Zuwachs und bekommen es ..

Ich habe es schon in 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++; 
    } 
} 

Aber ich machte es nicht Kotlin mit ..

Antwort

2

Ich glaube, Sie nur den Wert festlegen müssen und Verschieben Sie das Inkrement, damit es funktioniert - also sind der anfängliche Zähler und der Wert gleich.

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 
    } 
} 
+0

Sehr cool! Sie emulierten die beste Eigenschaft von C++! Siehe meine Antwort für den kurzen Weg. – voddan

5

jedes enum hat bereits eine automatisch generierte Eigenschaft ordinal:

enum class A {a, b, c} 

A.a.ordinal // 0 
A.b.ordinal // 1 
A.c.ordinal // 2 

der einfachste Weg, also technisch zu bekommen, was Sie wollen, ist dxgi_format_gli.DXGI_FORMAT_R64_UINT_GLI.ordinal + 1 (Ich habe keine Ahnung, warum Sie nicht starten wollen mit 0 0_o)

Sie den Code mit dieser in der @ griffio Antwort ersetzen kann:

enum class Dxgi_format_gli { 

    DXGI_FORMAT_R64_UINT_GLI, 
    DXGI_FORMAT_R64_SINT_GLI; 

    val value = ordinal + 1 
} 
+0

Danke für deine Antwort, aber ich fange nicht von '0' an, weil das der cpp Code ist, den ich portiere (es gibt eine Erklärung btw) – elect

+0

Cooler Vorschlag' Wert value = ordinal + 1' voddan, +1: p – elect

Verwandte Themen