Solidity

【Solidity】第4章第6回:列挙型(enum)の使い方

本記事では、Solidityで使用される列挙型(enum)の定義方法と使用例について解説します。列挙型を活用することで、選択肢を制限し、コードの可読性と安全性を向上させることができます。

0. 記事の概要

この記事を読むメリット

  • 列挙型の基礎を理解:列挙型の定義と使用方法を学べます。
  • コードの可読性向上:列挙型を活用した明確なプログラム設計を実現できます。
  • エラー防止の設計:選択肢を制限することで、誤入力や不正な値の指定を防ぎます。

この記事で学べること

  • 列挙型の基本構文と定義方法
  • 列挙型を使用した条件分岐やデータ管理
  • 列挙型に関するよくあるエラーとその解決策

1. 列挙型(enum)の基本

1.1 列挙型の概要

列挙型(enum)は、選択肢が限られているデータを扱う際に使用するデータ型です。数値で表現される複数の状態を、名前付き定数で定義することができます。

1.2 列挙型の基本構文

// 列挙型の基本例
contract EnumExample {
    enum Status { Pending, Shipped, Delivered, Cancelled }

    Status public currentStatus;

    function setStatus(Status _status) public {
        currentStatus = _status;
    }

    function getStatus() public view returns (Status) {
        return currentStatus;
    }
}

動作解説

このコードでは、Statusという列挙型を定義し、商品の状態を表現しています。関数setStatusで状態を設定し、getStatusで状態を取得できます。

2. 列挙型を使った条件分岐

2.1 状態に応じた処理

// 列挙型を使った条件分岐
contract ConditionalEnum {
    enum Status { Pending, Shipped, Delivered, Cancelled }

    Status public currentStatus;

    function setStatus(Status _status) public {
        currentStatus = _status;
    }

    function performAction() public view returns (string memory) {
        if (currentStatus == Status.Pending) {
            return "Order is pending.";
        } else if (currentStatus == Status.Shipped) {
            return "Order has been shipped.";
        } else if (currentStatus == Status.Delivered) {
            return "Order has been delivered.";
        } else if (currentStatus == Status.Cancelled) {
            return "Order has been cancelled.";
        }
        return "Unknown status.";
    }
}

動作解説

このコードでは、列挙型の値に応じて異なる処理を実行する例を示しています。

3. 列挙型を活用したデータ管理

3.1 商品の状態管理

// 商品状態の管理
contract ProductStatus {
    enum Status { Available, OutOfStock, Discontinued }

    struct Product {
        string name;
        uint256 price;
        Status status;
    }

    mapping(uint256 => Product) public products;

    function addProduct(uint256 _id, string memory _name, uint256 _price, Status _status) public {
        products[_id] = Product(_name, _price, _status);
    }

    function getProductStatus(uint256 _id) public view returns (Status) {
        return products[_id].status;
    }
}

動作解説

この例では、商品に状態を持たせ、商品ごとに現在の状態を管理しています。

4. よくあるエラーとその解決策

4.1 未定義状態の使用

列挙型は暗黙的に整数値として扱われるため、定義されていない状態を使用することが可能です。これを防ぐには、入力値を厳密に検証する必要があります。

4.2 型変換エラー

列挙型を他の型に変換する場合、明示的なキャストが必要です。適切なキャストを使用することで、このエラーを防ぐことができます。

5. 練習問題

以下の課題に挑戦してみましょう:

  1. 列挙型を使用して会員ステータスを管理するコントラクトを作成してください。
  2. 商品状態に応じて異なる価格を設定する機能を追加してください。

6. まとめ

本記事では、Solidityの列挙型(enum)の基本的な使い方について学びました。列挙型を使用することで、状態を明確に管理し、コードの可読性と安全性を向上させることが可能です。