Swiftのクラスと構造体(Classes And Structures)

クラスと構造体(Classes and Structures)

クラス(Classes)です。クラスが理解できれば一気にプログラミングの世界が広がる、と思います。Swiftではクラスと構造体(Structures)は「カプセル化」という意味では、ほとんど同じ機能を持っています。記事中で詳しく説明しますが、この2つの大きな違いは「値型か参照型か?」です。この値型と参照型という点に着目すると、実はクラスは関数(またはクロージャ)と同じ分類で、構造体は列挙型と同類になります。

ここでは、クラスと構造体とは何か?ということから始めて、それらの定義の仕方、インスタンスとは何か?、値型と参照型の違い、などを詳しく説明していきます。

クラス(Classes)とは何か?

クラス(Classes)は良く「物(Object、目的)」で例えられます。クラスを生成できるプログラム言語を「オブジェクト指向言語」と呼んだりします。クラスとは一言で言うと

です。このカプセル化した全体を物で例えると分かりやすいです。

[図解]クラスによるカプセル化

上の図はクラスの簡単な概念図です。先ほど書いたように、クラスとは様々なプロパティ(Properties)メソッド(Methods)をひとまとめにした箱のようなものです。同じような言葉で関数(functions)を表現すると、

関数は機能のカプセル化

であると言えます。そういう意味では、クラスは関数も包含するような、より上位の(より一般的な)仕組みであると言えます。もう少しプログラミング風に言うと、クラス(と構造体)はユーザが定義する「独自型」です。

構造体(Structures)も、基本的にはクラスと同様に、プロパティとメソッドをカプセル化するためのものです。C言語と比べると、メソッドを内包できるというのが大きな違いでしょうか?そういう意味では、Swiftの構造体(列挙型も)は非常に多機能です。構造体の具体的な機能に関しては後述します。

少し脱線しますが、メソッドというのは関数のことです。メソッドと関数は同じものですが、クラスや構造体(厳密に言うと、ある特定の型)の中にある関数をメソッド、だと思ってもらえれば良いです。また、プロパティとは、メソッドと同様に、ある特定の型に属する定数や変数などを指します。プロパティやメソッドは「Swiftをもっと深く学ぶ」で詳しく説明します。

クラスと構造体を選ぶ指針?

プログラムを組む場合「これはクラスにするべきか、構造体にするべきか、どっちだろう?」と迷うことがあると思います。公式マニュアルには、一般的なガイドラインとして構造体を選ぶべき指針が示されていますので引用します。

  • 構造体の最も重要な役割は、比較的簡単な数個のデータ(値)をひとまとめにすること
  • その構造体インスタンスを割り当てたり、別の変数に渡したりする場合、ひとまとめにされた値は(参照ではなく)コピーされると期待するのが妥当
  • 構造体のプロパティは値型なので、やっぱりコピーされると予想できるのでは?参照ではなくて
  • 構造体は、異なる既存の型からプロパティなんかを継承する必要がない

この中の少なくともどれか1つが当てはまれば構造体を考えた方が良いようです。公式マニュアルには具体例もありますので、そちらも参照して下さい。このようなケースに当てはまらない場合はクラスにするべし、とのことです。

まとめ

  • クラスは「プロパティ(変数など)」と「メソッド(機能)」のカプセル化
  • クラス(構造体)はSwiftの新しい自作型
  • 数個のデータをひとまとめにしたような型(機能)を実装したい場合は迷わず構造体