Swift でのクラスと構造体には、共通する部分がたくさんあります。両方が以下に対応しています。

  • 値を保存するプロパティを定義
  • 機能を提供するメソッドを定義
  • サブスクリプトシンタックスで値にアクセスするサブスクリプトを定義
  • 初期状態にセットアップするイニシャライザを定義
  • デフォルトの実装を越えて機能を拡張
  • ある種の標準機能を提供するプロトコルに準拠

詳細な情報は、PropertiesMethodsSubscriptsInitializationExtensionsProtocols を確認してください。

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

  • 別のクラスの特徴を受け継ぐ継承
  • 実行時にインスタンスの型を解釈する型キャスト
  • インスタンスに割り当てられたリソースを解放するデイニシャライザ
  • インスタンスを複数参照する参照カウント

詳細な情報は、InheritanceType CastingDeinitializationAutomatic Reference Counting を確認してください。

NOTE
構造体が渡されるときには、構造体は常にコピーされ、参照カウントしません。

定義シンタックス

クラスと構造体の定義シンタックスはよく似ています。クラスは class キーワードで、構造体は struct キーワードで始めます。共に、定義全体を波括弧内に置きます。

class SomeClass {
    // クラス定義
}
struct SomeStructure {
    // 構造体定義
}
NOTE
新しいクラスまたは構造体を定義すると、実質的には Swift の新しい型を定義しています。Swift の(StringIntBool のような)標準的な型の大文字に合うよう、型の名前を(SomeClassSomeStructure のような)UpperCamelCase にします。一方で、プロパティやメソッドの名前は型の名前と区別するため常に(frameRateincrementCount のような)lowerCamelCase にします。

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

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

この例では、ピクセルベースの表示解像度を表す構造体 Resolution を定義しています。この構造体には 2 つのプロパティ width と height があります。プロパティは定数または変数で、クラスか構造体の一部です。これらのプロパティは初期値 0 に設定されているため、Int 型と推論されます。

上の例では、ビデオ表示用の、特定のビデオモードを表すクラス VideoMode も定義しています。このクラスには変数のプロパティが 4 つあります。はじめの resolution は、構造体 Resolution のインスタンスで初期化されています。他の 3 つのプロパティについて、interlaced の設定が false(つまりインターレースでないビデオ)で、再生フレームレートが 0.0、およびオプショナル String 値の name で VideoMode のインスタンスは初期化されます。name プロパティはオプショナルの型なので、自動的にデフォルト値の nilname の値が無い)になります。

クラスと構造体のインスタンス

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

インスタンスを生成するシンタックスは、構造体とクラスでとても似ています。

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

構造体とクラスは共に、イニシャライザシンタックスで新しいインスタンスを生成します。イニシャライザシンタックスの最もシンプルな形式は、Resolution() または VideoMode() のようにクラス名または構造体名に丸括弧を続けます。これでクラスまたは構造体の新しいインスタンスが、デフォルト値に初期化されたプロパティで生成されます。クラスと構造体の初期化についての詳細は、Initialization で説明されています。

プロパティにアクセス

ドットシンタックスでインスタンスのプロパティにアクセスすることができます。ドットシンタックスでは、インスタンス名の直後をピリオドで区切り、スペース無しでプロパティ名を記述します。

print("The width of someResolution is \(someResolution.width)")
// "The width of someResolution is 0" と出力

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

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

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// "The width of someVideoMode is 0" と出力

また、変数のプロパティにドットシンタックスで新しい値を代入できます。

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// "The width of someVideoMode is now 1280" と出力
NOTE
Objective-C と異なり、Swift では構造体のプロパティのサブプロパティに直接設定することができます。上の最後の例では、resolution プロパティ全体を新しい値に設定することなく、someVideoModeresolution プロパティの width プロパティに直接設定しています。

構造体のメンバーワイズイニシャライザ

すべての構造体には自動的に生成されるメンバーワイズイニシャライザがあり、構造体インスタンスのメンバープロパティを初期化することができます。メンバーワイズイニシャライザに、インスタンスのプロパティの初期値を名前で指定して渡すことができます。

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

構造体とは異なり、クラスインスタンスはメンバーワイズイニシャライザを受け取りません。イニシャライザについての詳細は、Initialization で説明されています。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.