🪶

Swiftはなぜ sturct を使う

に公開

classとstructの使い分け?

なぜ使い分けるのか調べてみた。

Swiftの設計の本に書いてあった。

https://peaks.cc/books/iOS_architecture

class の問題点を指摘しています。

• 複数のオブジェクトで暗黙的に同じデータが共有される
• 継承に過剰に縛られ、親クラスが保持するプロパティに合わせたり、不変条件を壊さな
いための考慮が必要
• オーバーライドしたメソッドの引数が親クラスになるため、型の関係性を失う
よりよい抽象化のメカニズムとして、Swift は protocol を中心とした言語設計を採用しまし
た。Swift では class の使用は最小限に留め、struct や enum でイミュータブルに型設計を行
い、ポリモーフィズムの実現方法としては class の継承ではなく protocol を利用したほうがよ
いとされます。
同セッションによると class を使うべきケースは次の2点だけです。
• 標準 framework で class が提供されており、それを継承しなければいけない場合
• 本当に暗黙的な共有が必要な場合

別の解説

Swiftでは、クラスと構造体は似ていますが、いくつかの重要な違いがあります。クラスは参照型であり、構造体は値型です。これは、クラスのインスタンスが複数のオブジェクトで共有される可能性があることを意味します。一方、構造体のインスタンスはコピーされ、それぞれが独自のデータを持つため、データの共有は発生しません。

また、クラスは継承をサポートしていますが、構造体はサポートしていません。これは、クラスが親クラスのプロパティやメソッドをオーバーライドする必要がある場合、型の関係性を失う可能性があることを意味します。一方、構造体は継承をサポートしていないため、この問題は発生しません。

Swiftでは、より良い抽象化のメカニズムとして、プロトコルを中心とした言語設計が採用されています。これにより、クラスの使用は最小限に留め、構造体や列挙型で不変の型設計を行うことが推奨されています。

構造体とクラス

データをカプセル化するカスタム型をモデル化する。

構造体とクラスは汎用的で柔軟な構造体であり、プログラム・コードのビルディング・ブロックとなります。定数、変数、関数を定義するために使用するのと同じ構文を使用して、構造体とクラスに機能を追加するためのプロパティとメソッドを定義します。

他のプログラミング言語とは異なり、Swift では、カスタム構造やカスタムクラスのために、個別のインターフェイスや実装ファイルを作成する必要はありません。Swift では、単一のファイルで構造やクラスを定義し、そのクラスや構造への外部インターフェイスは、自動的に他のコードが使用できるようになります。

クラスのインスタンスは、伝統的にオブジェクトとして知られています。しかし、Swift の構造体とクラスは、他の言語よりもはるかに近い機能を持っており、この章の多くは、クラスまたは構造体タイプのインスタンスに適用される機能を説明します。このため、より一般的なインスタンスという用語が使用されます。

参考になった情報

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/classesandstructures/

まとめ

複数のオブジェクトで暗黙的に同じデータが共有される
継承に過剰に縛られ、親クラスが保持するプロパティに合わせたり、不変条件を壊さな
いための考慮が必要

オーバーライドしたメソッドの引数が親クラスになるため、型の関係性を失う
よりよい抽象化のメカニズムとして、Swift は protocol を中心とした言語設計を採用しまし
た。

Swift では class の使用は最小限に留め、struct や enum でイミュータブルに型設計を行
い、ポリモーフィズムの実現方法としては class の継承ではなく protocol を利用したほうがよ
いとされます。

Discussion