【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. 練習問題
以下の課題に挑戦してみましょう:
- 列挙型を使用して会員ステータスを管理するコントラクトを作成してください。
- 商品状態に応じて異なる価格を設定する機能を追加してください。
6. まとめ
本記事では、Solidityの列挙型(enum)の基本的な使い方について学びました。列挙型を使用することで、状態を明確に管理し、コードの可読性と安全性を向上させることが可能です。