LoginSignup
3
3

More than 5 years have passed since last update.

【備忘録】initの動作検証

Last updated at Posted at 2015-10-14

意味のある検証かどうかは置いておいて・・・

スーパークラスのイニシャライザはsuper.init()を明示しなくても自動的に呼ばれる。
ただし、この時の呼び出し順はサブクラス→スーパークラスの順番。

swift(オーバーライド時にsuper.init()なし)
class Parent {
    let name:String = "Parent"
    init(){
        print("\(name)")
    }
}

class Child : Parent {

    let childname:String = "Child"
    override init(){
        print("\(childname)")
    }

}

class Grandson : Child {

    let grandsonname:String = "Grandson"
    override init(){
        print("\(grandsonname)")
    }
}

let grandson = Grandson()


//結果: Grandson
//      Child
//      Parent

オーバーライドでinitの直後にsuper.init()を入れた場合、スーパークラス→サブクラスの順に呼び出される。当たり前か。

swift(オーバーライド時にsuper.init()あり)
class Parent {
    let name:String = "Parent"
    init(){
        print("\(name)")
    }
}

class Child : Parent {

    let childname:String = "Child"
    override init(){
        super.init() //追加
        print("\(childname)")
    }

}

class Grandson : Child {

    let grandsonname:String = "Grandson"
    override init(){
        super.init() //追加
        print("\(grandsonname)")
    }
}

let grandson = Grandson()


// 結果:Parent
//      Child
//      Grandson

試しにGrandsonクラスのsuper.init()の位置を入れ替えてみた。
super.init()がイニシャライザを明示的に呼び出している。当たり前か。

swift(super.init()位置を入れ替え)
(省略)
class Grandson : Child {

    let grandsonname:String = "Grandson"
    override init(){
        print("\(grandsonname)")
        super.init() //上から移動
    }
}

let grandson = Grandson()

// 結果:Grandson
//      Parent
//      Child

super.init()を思い切って消してみた。
するとsuper.init()の位置を入れ替えた時と同じ結果になった。当たり前か。
もしかして、super.init()を省略しても、イニシャライザの最後に自動的に組み込まれているのかも?

swift(super.init()を削除)
(省略)
class Grandson : Child {

    let grandsonname:String = "Grandson"
    override init(){
        print("\(grandsonname)")
    }
}

let grandson = Grandson()

// 結果:Grandson
//      Parent
//      Child
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3