如何迭代枚举摘要以获得键值对列表?
示例:
@:enum
abstract ExampleEnumAbstract(UInt) {
public var value1 = 0x0;
public var value2 = 0x1;
public var value3 = 0x2;
}
对于枚举实例,可以完成此操作,例如:
enum ExampleEnum {
Value1;
Value2;
Value3;
}
for(value in Type.allEnums(ExampleEnum))
trace(value);
}
不确定这是否是最好的方法 - 我可以获得钥匙;但是,我无法获得价值,如:
var keys:Array<String> = Type.getClassFields(ExampleEnumAbstract)
for (key in keys) {
trace(key + " = " + ExampleEnumAbstract[key]);
}
尝试以这种方式获取值会产生编译时错误:
字符串应为Int
不允许访问数组
Class<ExampleEnumAbstract.ExampleEnumAbstract_Impl_>
最终,map
个键值对将是理想的。
答案 0 :(得分:5)
据我所知,目前尚无规范。枚举摘要有点hackish,通常只用于绑定和低级优化。我怀疑在不久的将来和所有平台上都可以期待rtti能够正常使用它们(顺便提一下,所有的摘要都是如此)。
所以,最好的实际方法是
@:enum abstract ExampleEnumAbstract(UInt) {
public var value1 = 0x0;
public var value2 = 0x1;
public var value3 = 0x2;
public static function getConstructorsValues():Map<String, UInt> return [
'value1' => 0,
'value2' => 1,
'value3' => 2,
];
}
你也可以为你创建一个宏来生成这个(或类似的)函数。
回到你的ExampleEnumAbstract[key]
代码:当然它不会起作用。您可以使用Reflect.field
使其工作,但不能保证运行时存在的值。