コンビニエンスイニシャライザについて

クラスは複数のイニシャライザを持てることができる。また、その様な場合、一方のイニシャライザから別のイニシャライザを呼び出すことができる。これがコンビニエンスイニシャライザ。

class TestClass {
    let name: String
    let msg: String

    // 指定イニシャライザ
    init(name: String, msg: String) {
        self.name = name
        self.msg = msg
    }

    // initにconvenienceをつけることで、コンビニエンスイニシャライザになる
    convenience init(msg: String = "convenience initizalizerにて初期化") {
        // 指定イニシャライザを呼び出す
        self.init(name: "A", msg: msg)
    }

    func printMsg() {
        let text = name + ": " + msg
        print(text)
    }
}

class OtherTestClass {

    let obj1 = TestClass()
    let obj2 = TestClass(msg: "これもconvenience initizalizerにて初期化")
    let obj3 = TestClass(name: "B", msg: "指定イニシャライザにて初期化")
    
    // ...
    obj1.printMsg() // A: convenience initizalizerにて初期化
    obj2.printMsg() // A: これもconvenience initizalizerにて初期化
    obj3.printMsg() // B: 指定イニシャライザにて初期化
}

まとめ

通常、obj1とobj2のインスタンス生成は、引数がTestClassのイニシャライザの引数とマッチしていないため、エラーになる。 しかし、コンビニエンスイニシャライザを用いることによってインスタンス作成時にはエラーにならない(内部的には指定イニシャライザを呼んでいる)