Swiftの「クラス(Class)」と「構造体(Struct)」はどちらもデータと機能をひとまとめにしたカスタムデータ型を定義するための仕組みですが、挙動や使いどころに明確な違いがあります。以下にそれぞれの違いを詳しく説明します。
1. 値型(Value Type)と参照型(Reference Type)
-
構造体(Struct)は値型です。
-
変数や定数に代入されたとき、コピーされます。
-
関数に渡すときも、値のコピーが渡されます。
-
-
クラス(Class)は参照型です。
-
変数や定数に代入されたとき、同じインスタンスへの参照が渡されます。
-
関数に渡すときも、同じインスタンスへの参照が渡されます。
-
例
2. 継承の可否
-
構造体は継承できません。
-
クラスは継承可能です(サブクラス化できる)。
3. 初期化子(Initializer)の自動生成
-
構造体はすべてのプロパティを引数に取るメンバーワイズイニシャライザが自動で生成されます。
-
クラスは初期化子を明示的に定義する必要があります(または
initを省略したデフォルトイニシャライザを使用)。
4. デイニシャライザ(deinit)の有無
-
構造体には
deinit(デイニシャライザ)はありません。 -
クラスはデイニシャライザを定義でき、インスタンスが破棄される直前に呼ばれます。
5. ARC(自動参照カウント)対象か否か
-
構造体は値型のため、ARC(Automatic Reference Counting)管理の対象外です。
-
クラスは参照型のため、ARCでメモリ管理されます。
6. 使い分けの指針
| 用途 | 構造体を使うべき場合 | クラスを使うべき場合 |
|---|---|---|
| データがコピーされても問題ない場合 | ✅ 値が独立しているべき小さなデータ構造(例:Point, Size) | ❌ (この場合クラスは不要) |
| 状態共有や継承が必要な場合 | ❌ 構造体では不適切 | ✅ オブジェクトの状態を共有・継承する設計が可能 |
| メモリ管理の明示的な必要性(ARCが必要) | ❌ 不要 | ✅ ARCによるライフサイクル管理が可能 |
まとめ
| 特徴 | クラス(Class) | 構造体(Struct) |
|---|---|---|
| データの扱い | 参照型(Reference Type) | 値型(Value Type) |
| 継承 | 可能 | 不可 |
| イニシャライザの自動生成 | 原則なし(明示的に必要) | 自動で提供される |
| デイニシャライザ(deinit) | 使用可能 | 使用不可 |
| ARC(自動参照カウント) | 対象 | 対象外 |
Swiftでは、デフォルトで構造体の使用が推奨されており、クラスは状態の共有や継承が必要な場合にのみ使うのが基本方針です。
生成日:2025/05/04