enum と構造体の違い
Swiftにおける enum(列挙型)と struct(構造体)の主な違いは、表現したいデータの性質にあります。どちらもメソッドやプロパティを持つことができる値型ですが、用途が異なります。
主な違い
| 比較項目 | enum(列挙型) | struct(構造体) |
|---|---|---|
| 意味・用途 | 限定された「選択肢」や「状態」を表す。 | 複数の「データ(プロパティ)のまとまり」を表す。 |
| 表現方法 | 複数のcase(ケース)のいずれか1つである状態を表現する。 | 複数の異なるデータを同時に保持する構造を表現する。 |
| インスタンス化 | 特定のケースとしてのみ存在する。 | データを持った具体的なインスタンスとして生成される。 |
| 関連値 | 各ケースに異なる型の関連値(Associated Values)を持たせることができる。 | 独自のプロパティ(stored properties)を持つ。 |
詳細な説明
enum(列挙型)
enumは、取りうる値が固定されていて、そのうちの1つだけを選択的に表現したい場合に使用します。
- 例: 信号機の色 (
赤,黄,青)、ユーザーの状態 (ログイン中,ログアウト中)、曜日など。 - 各ケースに異なるデータを付加できる「関連値」の機能が強力で、例えばエラーの種類とそれに付随する詳細情報を一緒に表現するのに適しています。
|
1 2 3 4 5 6 7 8 9 10 |
enum TrafficLight { case red case yellow case green } enum APIError { case networkError(code: Int, message: String) case notFound } |
struct(構造体)
structは、複数の異なるプロパティを組み合わせて一つのまとまったデータ構造を表現したい場合に使用します。
- 例: ユーザー情報 (
名前,年齢,住所)、座標 (x,y)、商品の詳細情報など。 - データそのものをモデル化し、そのデータの塊に対して振る舞い(メソッド)を追加するのに適しています。
|
1 2 3 4 5 6 7 8 9 10 |
struct User { var name: String var age: Int var address: String } struct Point { var x: Double var y: Double } |
まとめ
どちらも値型であり、メソッドを定義できるなど共通点も多いですが、**「閉じた選択肢の集合」を扱いたい場合はenum、「複数のプロパティで構成されるデータの塊」**を扱いたい場合はstructを選ぶのが基本的な使い分けとなります。
VBA の enum との違い
VBAのEnumとSwiftのenumは、名前は同じですが性質と機能が大きく異なります。
VBAのEnumが単なる整数の定数に別名を付けたエイリアス(別名)であるのに対し、Swiftのenumは遥かに強力で、言語の重要な構成要素の一つです。
VBAのEnumの性質
VBAのEnumは、基本的に整数値のグループ化と可読性の向上を目的としています。
|
1 2 3 4 5 6 7 |
' VBAの例 Public Enum Color Red = 1 Green = 2 Blue = 3 End Enum ' 内部的には単なる整数 (Long型) |
Swiftのenumの強力な点
Swiftのenumは、VBAとは異なり、以下のような高度な機能を持っています。
- 関連値 (Associated Values):
各ケースが異なる型のデータを持つことができます。これがVBAにはない最大の機能です。(前の回答のAPIError.networkError(code: Int, message: String)のように) - メソッドとプロパティ:
structやclassと同様に、計算プロパティやインスタンスメソッドを持つことができます。 - 値型としての振る舞い:
structと同様に値型として扱われます。
まとめ
VBAからSwiftへ移行される場合、Swiftのenumは「単なる定数」ではなく、「高度な機能を持つ独自のデータ型」として捉える必要があります。この違いを理解すると、Swiftでのデータモデリングの幅が大きく広がります。

コメント