見出し画像

Swiftでプログラミング。-Structures and Classes 1

構造体やクラスは,プログラムのコードを構成する要素となる,汎用的で柔軟な構造体です.定数、変数、および関数を定義するのに使用するのと同じ構文を使用して、構造体とクラスに機能を追加するためのプロパティとメソッドを定義します。

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

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

Comparing Structures and Classes  構造体とクラスの比較

Swiftにおける構造体とクラスには、多くの共通点があります。どちらもできることは

・値を格納するためにプロパティを定義する
・機能を提供するメソッドを定義する
・添え字構文を使用して値へのアクセスを提供するために添え字を定義する
・それらの初期状態を設定するためにイニシャライザを定義する
・デフォルトの実装よりも機能を拡張するための拡張機能
・プロトコルに準拠して、特定の種類の標準的な機能を提供する。

クラスには、構造体にはない機能があります。

継承により、あるクラスが別のクラスの特性を引き継ぐことができます。
型キャストにより、クラスのインスタンスの型を実行時にチェックして解釈することができます。
デイニシャライザは、クラスのインスタンスが割り当てられたリソースを解放します。
参照カウントは、クラス・インスタンスへの複数の参照を可能にします。

クラスがサポートする機能が増えると、その分、複雑さが増します。一般的なガイドラインとしては、構造体の方が推論しやすいので、構造体を使用し、必要に応じてクラスを使用してください。実際には、あなたが定義するカスタムデータ型のほとんどが構造体や列挙体であることを意味します。

Definition Syntax  定義構文

構造体とクラスの定義構文は似ています。構造体は struct キーワードで、クラスは class キーワードで導入します。どちらも定義全体を中括弧で囲みます。

   struct SomeStructure {
       // structure definition goes here
   }
   class SomeClass {
       // class definition goes here
   }
新しい構造体やクラスを定義するときはいつも、新しいSwiftの型を定義します。標準的なSwiftの型(String、Int、Boolなど)の大文字と一致するように、型にUpperCamelCaseの名前(SomeStructureやSomeClassなど)を与えます。型の名前と区別するために、プロパティとメソッドに小文字の名前(frameRateやincrementCountなど)を与えます。

以下は、構造体定義とクラス定義の例です。

   struct Resolution {
       var width = 0
       var height = 0
   }
   class VideoMode {
       var resolution = Resolution()
       var interlaced = false
       var frameRate = 0.0
       var name: String?
   }

上の例では、ピクセルベースのディスプレイの解像度を記述するために、Resolutionという新しい構造体を定義しています。この構造体には、widthとheightという2つのストアドプロパティがあります。ストアドプロパティとは、構造体やクラスの一部としてまとまって格納されている定数や変数のことです。これらの2つのプロパティは、初期値として整数値の0を設定することで、Int型であることが推測されます。

また、上記の例では、ビデオ表示のための特定のビデオモードを記述するために、VideoModeという新しいクラスを定義しています。このクラスには、4つの変数が格納されたプロパティがあります。1つ目のresolutionは、新しいResolution構造体のインスタンスで初期化され、プロパティのタイプはResolutionとなります。他の3つのプロパティについては、新しいVideoModeインスタンスが、インターレース設定のfalse(「ノンインターレースビデオ」を意味する)、再生フレームレートの0.0、およびnameというオプションのString値で初期化されます。nameプロパティは、オプションタイプであるため、自動的にnil(名前のない値)のデフォルト値が与えられます。

Structure and Class Instances

Resolution構造体の定義とVideoModeクラスの定義は、ResolutionやVideoModeがどのようなものかを記述しているだけです。それ自体は、特定の解像度やビデオモードを記述するものではありません。そのためには、構造体やクラスのインスタンスを作成する必要があります。

インスタンスを作成するための構文は、構造体でもクラスでもよく似ています。

   let someResolution = Resolution()
   let someVideoMode = VideoMode()

構造体もクラスも、新しいインスタンスにはイニシャライザ構文を使用します。最も簡単なイニシャライザ構文は、クラスや構造体の型名の後に空の括弧をつけたもので、Resolution()やVideoMode()などがこれにあたります。これにより、クラスまたは構造体の新しいインスタンスが作成され、すべてのプロパティがデフォルト値に初期化されます。クラスや構造体の初期化については、「初期化」で詳しく説明しています。

Accessing Properties  プロパティへのアクセス

インスタンスのプロパティにアクセスするには、ドット構文を使用します。ドット構文では、インスタンス名の直後にプロパティ名をピリオド(.)で区切り、スペースを入れずに記述します

    print("The width of someResolution is \(someResolution.width)")
   // Prints "The width of someResolution is 0"

この例では、someResolution.width は someResolution の width プロパティを参照しており、そのデフォルトの初期値である 0 を返します。

VideoMode の resolution プロパティの width プロパティのように、サブプロパティを掘り下げることができます。

    print("The width of someVideoMode is \(someVideoMode.resolution.width)")
   // Prints "The width of someVideoMode is 0"

また、ドット構文を使って、変数のプロパティに新しい値を割り当てることもできます。

   someVideoMode.resolution.width = 1280
   print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
   // Prints "The width of someVideoMode is now 1280"

Memberwise Initializers for Structure Types   全項目イニシャライザ

すべての構造体には、自動的に生成される全項目イニシャライザがあり、これを使って新しい構造体インスタンスのメンバー・プロパティを初期化することができます。新しいインスタンスのプロパティの初期値は、名前を付けて全項目イニシャライザに渡すことができます。

let vga = Resolution(width: 640, height: 480)

構造体とは異なり、クラスインスタンスにはメンバーごとのデフォルトのイニシャライザはありません。

この記事が気に入ったらサポートをしてみませんか?