イニシャライザは、インスタンスの初期化の一部を実行するために、他のイニシャライザを呼び出すことができます。イニシャライザデリゲーションと呼ぶこの処理によって、複数のイニシャライザ間でコードが重複しないようにします。

イニシャライザデリゲーションがどのように機能するかというルールと、どの形式のデリゲーションが許容されるかというルールは、値型とクラス型で異なります。値型(構造体と列挙型)は継承をサポートせず、型自体が持つ別のイニシャライザのみデリゲートすることができるため、イニシャライザデリゲーションの処理は比較的シンプルです。一方で、クラスは Inheritance で説明されているように、他のクラスから継承することができます。つまり、クラスには継承するすべてのストアドプロパティが、初期化の間に適切な値が代入されるようにする追加の責務があります。この責務については、Class Inheritance and Initialization で説明されています。

値型では、独自のイニシャライザを記述するとき、同じ値型から別のイニシャライザを参照するために self.init を使用します。イニシャライザ内からのみ self.init を呼び出すことができます。

値型にイニシャライザを定義する場合、その型のデフォルトイニシャライザ(構造型ではメンバーワイズイニシャライザ)にアクセスできなくなることに留意してください。この制約により、複雑なイニシャライザでの必要不可欠な追加セットアップが、自動イニシャライザを使用することによって誤って迂回されてしまう事態を防ぎます。

NOTE
値型をデフォルトイニシャライザとメンバーワイズイニシャライザ、および独自のイニシャライザでも初期化できるようにしたい場合、値型の実装の一部としてではなく、エクステンションに独自のイニシャライザを記述します。詳細は Extensions を確認してください。

以降の例では、幾何学矩形を表現する構造体 Rect を定義しています。例には 2 つの構造体 Size と Point が必要で、両構造体のすべてのプロパティのデフォルト値は 0.0 です。

struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}

デフォルトのゼロで初期化された origin と size のプロパティ値を利用するか、具体的に原点とサイズを指定するか、具体的に中心点とサイズを指定するかの 3 つの方法のうち 1 つで構造体 Rect を初期化することができます。初期化のこれらのオプションは、構造体 Rect の定義の一部である 3 つのイニシャライザで表現されています。

struct Rect {
    var origin = Point()
    var size = Size()
    init() {}
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}

1 つ目の Rect イニシャライザ init() は、独自のイニシャライザが無かった場合に構造体にできるデフォルトイニシャライザと機能的に同じです。このイニシャライザには本体が空で、波括弧のペア {} で表現されています。このイニシャライザを呼び出すと、origin と size プロパティが共にプロパティ定義のデフォルト値 Point(x: 0.0, y: 0.0) と Size(width: 0.0, height: 0.0) で初期化される Rect インスタンスを返します。

let basicRect = Rect()
// basicRect の原点は (0.0, 0.0) で、サイズは (0.0, 0.0)

2 つ目の Rect イニシャライザ init(origin:size:) は、独自のイニシャライザが無かった場合に構造体にできるメンバーワイズイニシャライザと機能的に同じです。このイニシャライザは適切なストアドプロパティに origin と size の引数値を単に代入します。

let originRect = Rect(origin: Point(x: 2.0, y: 2.0),
                      size: Size(width: 5.0, height: 5.0))
// originRect の原点は (2.0, 2.0) で、サイズは (5.0, 5.0)

3 つ目の Rect イニシャライザ init(center:size:) は少しだけ複雑です。始めに center 点と size 値をベースに適切な原点を算出します。そして、新しい原点とサイズの値を適切なプロパティに保持するイニシャライザ init(origin:size:) を呼び出し(デリゲート)します。

let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
                      size: Size(width: 3.0, height: 3.0))
// centerRect の原点は (2.5, 2.5) で、サイズは (3.0, 3.0)

イニシャライザ init(center:size:) が、origin と size の新しい値を適切なプロパティに対して代入することもできます。ですが、同じ機能をすでに持っている既存のイニシャライザを活用するほうが、イニシャライザ init(center:size:) にとって便利(かつ意図が明確)です。

NOTE
init() と init(origin:size:) のイニシャライザを定義せずに、この例を記述する別の方法については、Extensions を確認してください。

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.