🦁

SwiftのConvenience Initializeについて

に公開

最初に

Convenience Initializeについて学習したので、まとめてみました。
スライドも作ったので良かったら見ていってください🙏

そもそもイニシャライザ(Initializer)って?

先ずはザックリとイニシャライザの概要について

イニシャライザはオブジェクト(インスタンス)を作る際に最初の値を設定するためのメソッドです。
イニシャライザでよく「初期化」と聞きますが、これは定数や変数に値を与えることの意味を指します。

定数や変数を初期化をして、インスタンス化した際に実行されるのがイニシャライザです。

下記の例では、Personクラスの初期化(下記のサンプルのinit(name: String)のこと)を行いインスタンスが作成される際にnameプロパティが必ず設定されるようになっています。

class Person {
    var name: String
    // イニシャライザ
    init(name: String) {
        self.name = name
    }
}

let person = Person(name: "Taro")

Convenience Initializerについて

コンビニエンスイニシャライザ(Convenience Initialize)はイニシャライザの補助的な役割をするイニシャライザの一種です。既存のイニシャライザを再利用しながら、追加の初期化ロジックを作成し利用することができます。

下記の例では、イニシャライザを設定すると同時にコンビニエンスイニシャライザを使用しています。
この時に、person1はインスタンスを生成した際に「name」と「age」の値を設定しています。

person1は「Hanako」「25」と設定されます。

しかし、person2ではコンビニエンスイニシャライザで「age」に20の値を設定しています。

person2でインスタンスを生成した際には「name」の値の設定だけを行いました。コンビニエンスイニシャラでデフォルト値を設定したので、20の値が自動設定されます。従って、person2は「Hanako」「20」と設定されます。

class Person {
    var name: String
    var age: Int

    // 指定イニシャライザ(メインのイニシャライザ)
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    // コンビニエンスイニシャライザ(デフォルト値を提供)
    convenience init(name: String) {
        self.init(name: name, age: 20)  // デフォルトの年齢を20に設定
    }
}

// 使用例
let person1 = Person(name: "Hanako", age: 25)
let person2 = Person(name: "Taro")  // 年齢は20に自動設定

self.initとは

convenience init を定義した後にself.init()と書かないとエラーになります。

self.init()ですが、これは指定イニシャライザを呼び出すために使用しています。
convenience initではプロパティへの直接代入ができないので、必ず別のイニシャライザを経由して初期化する必要があります。

// 直接代入はできないのでエラー
convenience init(name: String) {
    self.name = name  // エラー
    self.age = 20     // エラー
}
// 'self' used before 'self.init' call

イメージとしては、他のイニシャライザを通じてプロパティを初期化する必要があるためselfを明示的に使用し「このクラスの別のイニシャライザを呼び出してね」ということをSwiftに指示していてます。

ざっくりまとめ Convenience Initializerの注意点

  • 指定イニシャライザを必ず呼び出す必要がある
    • self.init()を忘れない
  • 直接プロパティを設定できない
    • 必ず指定イニシャライザを経由してプロパティに値を設定する
  • 継承時の制限
    • convenienceはサブクラスで直接オーバーライドできない

Discussion