🈁

DartのEnumにデータ型と引数をつける

2024/03/15に公開

Tips💡

Swiftで、Enumを書いていて、Errorというデータ型を書いたり例外処理を書く場面があった。DartのEnumは他のEnumと比較すると弱いと聞くが最近は機能が追加されてるから同じことできるのではと試してみた。

このコードを見てふっと思った。

import UIKit

// throwing errors
enum Errors: Error {
    case OutOfStock
}

struct Stock {
    var totalLamps = 5
    mutating func sold(amount: Int) throws {
        if amount > totalLamps {
            throw Errors.OutOfStock
        } else {
            totalLamps = totalLamps - amount
        }
    }
}

var myStock = Stock()

do {
    try myStock.sold(amount: 8)
} catch {
    print(error)// OutOfStock
}

Dartで似たようなことはできないのか...
Enumにプロトコルをつけるとかデータ型を継承するとかはできない。でもインターフェースを継承することはできる。一緒か....
implementsを使っているから、Exceptionを実装していることになるかな。Enumのプロパティに引数をつけてみた。ロジックで参照するときは、final String message;を使う。

thisを使うと、Enum内のプロパティを参照することができる。

enum ErrorHandling implements Exception {
  // Error handling
  failed("エラーが発生しました!"),
  // Success handling
  success("データの取得に成功しました!");
  const ErrorHandling(this.message);
  final String message;
}

String fetchData(String? value) {
  if(value != null) {
    print(ErrorHandling.success.message);
    return value;
  } else {
    throw ErrorHandling.failed.message;
  }
}

void main() {
  fetchData("null");
}

実行結果:

まとめ

他の言語をやっているとヒントを得ることが多いです。オブジェクト指向を理解しているから書けるだけなのかもしれない。いや私わかっていないかも💦

Discussion