クラスと構造体の違い

Swiftの「クラス(Class)」と「構造体(Struct)」はどちらもデータと機能をひとまとめにしたカスタムデータ型を定義するための仕組みですが、挙動や使いどころに明確な違いがあります。以下にそれぞれの違いを詳しく説明します。


1. 値型(Value Type)と参照型(Reference Type)

  • 構造体(Struct)値型です。

    • 変数や定数に代入されたとき、コピーされます。

    • 関数に渡すときも、値のコピーが渡されます。

  • クラス(Class)参照型です。

    • 変数や定数に代入されたとき、同じインスタンスへの参照が渡されます。

    • 関数に渡すときも、同じインスタンスへの参照が渡されます。

swift
struct PointStruct { var x: Int } class PointClass { var x: Int } var a = PointStruct(x: 10) var b = a b.x = 20 print(a.x) // 出力: 10(コピーなのでaは影響されない) var c = PointClass() c.x = 10 var d = c d.x = 20 print(c.x) // 出力: 20(参照なのでcも影響される)

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