Swiftのクラスでは、引数が異なる複数のイニシャライザを定義することができる。

例えば以下のような二つのinit()を持つクラスがあるとする。

class MyClass {
    let msg: String
    let name: String?
    
    init(msg:String = "ハロー") {
        self.msg = msg
        self.name = nil
    }
    
    init(msg:String = "ハロー", name:String) {
        self.msg = msg
        self.name = name
    }
    
    func hello() {
        if let user = name {
            print("\(user)さん。\(msg)")
        } else {
            print(msg)
        }
    }
}

このクラスのインスタンスを作成する時、以下のように複数のイニシャライザが現れる。

それでは一つずつバリエーションの違いを見ていこう。

一つ目のイニシャライザ

まずはMyClass内で定義した一つ目のイニシャライザを使ってインスタンスを作ってみる。

let myObj1 = MyClass(msg: "こんにちは")
myObj1.hello()
// こんにちは

この場合、msgには「こんにちは」が入るが、nameはnilのままなのでhello()メソッドの結果は「こんにちは」とだけ出力される。

二つ目のイニシャライザ

次に二つ目のイニシャライザを使ってみる。

let myObj2 = MyClass(msg: "こんにちは", name: "太郎")
myObj2.hello()
// 太郎さん。こんにちは

今度はnameに値を指定しているので、hello()メソッドの結果には名前とメッセージの二つが出力される。

引数なしでインスタンスを生成

今度は引数なしでインスタンスを生成してみよう。

let myObj3 = MyClass()
myObj3.hello()
// ハロー

このパターンは、一つ目のイニシャライザでmsgの指定を省略したケースになるので、msgには初期値の「ハロー」が入り、hello()メソッドの実行結果は「ハロー」とだけ出力される。

nameのみ指定するパターン

最後にnameのみ指定してインスタンスを生成するパターンを見てみよう。

let myObj4 = MyClass(name: "太郎")
myObj4.hello()
// 太郎さん。ハロー

この場合、nameには「太郎」が入りmsgを省略しているので、msgには初期値の「ハロー」が入る。

name、msgともにnilは存在しないため、hello()メソッドの実行結果にはどちらも出力される。