525 文字
3 分
【Dart】enumからint変換を実現する
Dartでは、TypeScriptのように以下のようなenumの記述ができません。
enum PostStatus {
unpublished = 0,
published = 1,
deleted = 2,
}
その代わりというわけではありませんが、dartではindexというものが利用できます。
enum PostStatus {
unpublished,
published,
deleted,
}
final unpublishedIndex = PostStatus.unpublished.index; // 0
final publishedIndex = PostStatus.published.index; // 1
final deletedIndex = PostStatus.deleted.index; // 2
基本的には上記のindexを用いた方法で対応できていましたが、ある時enumのデータとデータベース内の数値を関連付けたい時がありました。
この場合indexだと、データベースの値がenumで指定した順に依存してしまうことになってしまいます。データベースの値にenumをあわせるには以下のような方法があります。
1. parameterを使う
enumにはparameterを指定することができます。
enum PostStatus {
unpublished(0),
published(1),
deleted(99)
;
const PostStatus(this.id);
final int id;
}
// 以下のようにすると、enumのidを取得できます。
void main() {
print(PostStatus.deleted.id); // 99
}
2. メソッドを使う
今回の場合、複雑な処理などが不要なので、parameterを使う方法で問題ないかと思います。
parameterを渡すだけでは表現できない場合には、メソッドを追加するのが有効です。
enumの種類が増えるたび、メソッドも変更する必要はありますが、enum内で閉じていることに加え、toIntメソッドだけ変更し忘れると、静的チェックでエラーになるのでまだ対応しやすいのではないかと思います。
enum PostStatus {
unpublished,
published,
deleted,
;
int toInt() {
switch (this) {
case PostStatus.unpublished:
return 1;
case PostStatus.published:
return 2;
case PostStatus.deleted:
return 99;
}
}
// Widgetを返すなどの、処理はメソッドで実装するのが良さそうです。
Widget toWidget() {
switch (this) {
case PostStatus.unpublished:
return Text('Unpublished', style: TextStyle(color: Colors.grey));
case PostStatus.published:
return Text('Published', style: TextStyle(color: Colors.green));
case PostStatus.deleted:
return Text('Deleted', style: TextStyle(color: Colors.red));
}
}
}
final postStatus = PostStatus.unpublished.toString(); // "unpublished"
final postStatus = PostStatus.unpublished.toInt(); // 0
final postStatus = PostStatus.deleted.toInt(); // 99
final widget = PostStatus.unpublished.toWidget(); // Text('Unpublished', style: TextStyle(color: Colors.grey))
\てくのーと おすすめ書籍!/
社会人はもとより、今情報Ⅰを学んでいる人が、なぜ学ぶのか、
学んだ内容をどう活かせるのか、を知るために読むのも良いと思います! →感想詳細はこちら!