エクステンションで、既存の型に新しいイニシャライザを追加することができます。他の型を拡張して、イニシャライザのパラメータで独自の型をとれるようにしたり、型のオリジナルの実装に含まれていない初期化オプションを追加できるようにします。

エクステンションは、クラスに新しい convenience イニシャライザを追加できますが、クラスに新しい designated イニシャライザやデイニシャライザを追加することはできません。designated イニシャライザやデイニシャライザは、オリジナルのクラス実装にする必要があります。

NOTE

すべてのストアドプロパティにデフォルト値がある値型で、かつ独自のイニシャライザを定義していない値型に、イニシャライザを追加するためにエクステンションを使用する場合、エクステンションのイニシャライザ内から、その値型のデフォルトイニシャライザやメンバーワイズイニシャライザを呼び出すことができます。

これは、Initializer Delegation for Value Types で説明されているような、値型のオリジナル実装の一部としてイニシャライザを記述しているケースではありません。

次の例では、幾何学的な長方形を表現する構造体 Rect を定義しています。また、プロパティすべてのデフォルト値が 0.0 の構造体 Size と Point を定義しています。

struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
}

構造体 Rect はプロパティすべてにデフォルト値があるため、Default Initializers で説明されているように、デフォルトイニシャライザとメンバーワイズイニシャライザが自動的にできます。新しい Rect インスタンスを生成するためにこれらのイニシャライザを使用することができます。

let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
                          size: Size(width: 5.0, height: 5.0))

具体的な中心点とサイズを取る追加のイニシャライザを提供するように構造体 Rect を拡張することができます。

extension Rect {
    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)
    }
}

この新しいイニシャライザは、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 の origin は (2.5, 2.5) で、size は (3.0, 3.0)
NOTE
エクステンションで新しいイニシャライザを提供する場合でも、イニシャライザが完了したときに各インスタンスが完全に初期化されているようにする責任があります。

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.