Swift でのクラスと構造体には、共通する部分がたくさんあります。両方が以下に対応しています。
- 値を保存するプロパティを定義
- 機能を提供するメソッドを定義
- サブスクリプトシンタックスで値にアクセスするサブスクリプトを定義
- 初期状態にセットアップするイニシャライザを定義
- デフォルトの実装を越えて機能を拡張
- ある種の標準機能を提供するプロトコルに準拠
詳細な情報は、Properties, Methods, Subscripts, Initialization, Extensions, Protocols を確認してください。
クラスには、構造体には無い追加機能があります。
- 別のクラスの特徴を受け継ぐ継承
- 実行時にインスタンスの型を解釈する型キャスト
- インスタンスに割り当てられたリソースを解放するデイニシャライザ
- インスタンスを複数参照する参照カウント
詳細な情報は、Inheritance, Type Casting, Deinitialization, Automatic Reference Counting を確認してください。
定義シンタックス
クラスと構造体の定義シンタックスはよく似ています。クラスは class
キーワードで、構造体は struct
キーワードで始めます。共に、定義全体を波括弧内に置きます。
class SomeClass {
// クラス定義
}
struct SomeStructure {
// 構造体定義
}
String
や Int
、Bool
のような)標準的な型の大文字に合うよう、型の名前を(SomeClass
や SomeStructure
のような)UpperCamelCase
にします。一方で、プロパティやメソッドの名前は型の名前と区別するため常に(frameRate
や incrementCount
のような)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
プロパティはオプショナルの型なので、自動的にデフォルト値の nil
(name
の値が無い)になります。
クラスと構造体のインスタンス
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" と出力
resolution
プロパティ全体を新しい値に設定することなく、someVideoMode
の resolution
プロパティの 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.