Swiftのクラスでは前回記事で紹介したとおり、複数のイニシャライザを定義することができるが、今回はイニシャライザから別のイニシャライザを呼び出して実行するコンビニエンスイニシャライザの使い方を紹介する。

指定イニシャライザとコンビニエンスイニシャライザ

まず言葉の定義として、呼び出し側をコンビニエンスイニシャライザと言い、呼び出される側を指定イニシャライザと言う。

コンビニエンスイニシャライザを定義する際は、以下のようにinit()の前にconvenienceを付けて定義する必要がある。

convenience init() { }

コンビニエンスイニシャライザの使用例

では簡単な使用例を見ていこう。

以下のクラスがあるとする。

class MyClass {
    let msg: String
    let name: String
    
    // 指定イニシャライザ(A)
    init(msg:String, name:String) {
        self.msg = msg
        self.name = name
    }
    
    // コンビニエンスイニシャライザ(B)
    convenience init(msg:String = "ハロー") {
        self.init(msg:msg, name:"匿名")
    }
    
    func hello() {
        print("\(name)さん。\(msg)")
    }
}

インスタンス生成時、イニシャライザによっていくつかのパターンがあるが、引数の指定の仕方によって実行されるイニシャライザが変わる。

// イニシャライザBが実行される
let myObj1 = MyClass()
let myObj2 = MyClass(msg: "こんにちは")
myObj1.hello() // 匿名さん。ハロー
myObj2.hello() // 匿名さん。こんにちは

// イニシャライザAが実行される
let myObj3 = MyClass(msg: "やあ", name: "太郎")
myObj3.hello() // 太郎さん。やあ

上記の例では、引数を2つ受け取るイニシャライザはAの指定イニシャライザしかないためmyObj3ではAが実行され、残り2つのケースではBのコンビニエンスイニシャライザが実行される。