Set*_*add 56
Dart现在支持枚举.
这个答案的其余部分是Dart <= 1.8.如果使用> 1.8,请使用Dart对枚举的正式支持(在另一个答案中解释).
这是真的,Dart语言(但是?)没有枚举.有一个未解决的问题.
与此同时,这是一个惯用的Dart片段,用于创建自己的枚举.
class Enum {
final _value;
const Enum._internal(this._value);
toString() => 'Enum.$_value';
static const FOO = const Enum._internal('FOO');
static const BAR = const Enum._internal('BAR');
static const BAZ = const Enum._internal('BAZ');
}
Run Code Online (Sandbox Code Playgroud)
使用const构造函数意味着您可以在交换机中使用此枚举.这是一个例子:
class Fruits {
final _value;
const Fruits._internal(this._value);
toString() => 'Enum.$_value';
static const APPLE = const Fruits._internal('APPLE');
static const PEAR = const Fruits._internal('PEAR');
static const BANANA = const Fruits._internal('BANANA');
}
void main() {
var yummy = Fruits.BANANA;
switch (yummy) {
case Fruits.APPLE:
print('an apple a day');
break;
case Fruits.PEAR:
print('genus Pyrus in the family Rosaceae');
break;
case Fruits.BANANA:
print('open from the bottom, it is easier');
break;
}
}
Run Code Online (Sandbox Code Playgroud)
Gün*_*uer 15
有了r41815,Dart得到了原生的Enum支持,请参阅http://dartbug.com/21416并可以像
enum Status {
none,
running,
stopped,
paused
}
void main() {
print(Status.values);
Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
print('running: ${Status.running}, ${Status.running.index}');
print('running index: ${Status.values[1]}');
}
Run Code Online (Sandbox Code Playgroud)
[Status.none,Status.running,Status.stopped,Status.paused]
value:Status.none,index:0
value:Status.running,index:1
value:Status.stopped,index:2
value:Status.paused, index:3
运行:Status.running,1
运行索引:Status.running
限制是不可能为枚举项设置自定义值,它们会自动编号.
本草案中的更多细节https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf
小智 11
我在Dart Web Toolkit中使用了一个更简单的Enum类版本:
/**
* Emulation of Java Enum class.
*
* Example:
*
* class Meter<int> extends Enum<int> {
*
* const Meter(int val) : super (val);
*
* static const Meter HIGH = const Meter(100);
* static const Meter MIDDLE = const Meter(50);
* static const Meter LOW = const Meter(10);
* }
*
* and usage:
*
* assert (Meter.HIGH, 100);
* assert (Meter.HIGH is Meter);
*/
abstract class Enum<T> {
final T _value;
const Enum(this._value);
T get value => _value;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢枚举的顶级常量。您可以使用导入来修复任何冲突。这使得使用枚举不那么冗长。
IE
if (m == high) {}
Run Code Online (Sandbox Code Playgroud)
代替:
if (m == Meter.high) {}
Run Code Online (Sandbox Code Playgroud)
枚举定义:
class Meter<int> extends Enum<int> {
const Meter(int val) : super (val);
}
const Meter high = const Meter(100);
const Meter middle = const Meter(50);
const Meter low = const Meter(10);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16137 次 |
| 最近记录: |