swiftのイニシャライザまわりでコンパイルエラーになることが多かったのでいろいろ試してみた

swiftのイニシャライザまわりでコンパイルエラーになることが多くてちょっと調べてみた。
いろいろ実験しているが本当は原理を知らないといけないと思う。
でもうんこエンジニアなので原理を理解できない

§ まとめ

最初にまとめを書いておく

定数の定義 → super.init() → メソッドを呼ぶ

の順番で呼ぶと良い

§ 実験

継承してないパターン

■ initからメソッド呼び出し

これは普通に通る

import Foundation
class SampleUseCase {
    init() {
        bind()
    }
    
    func bind() {
       print("bind")
    }
}

■ let で変数を設定した場合

let の変数が全部初期化されたあとはメソッドを呼べる

=>これは問題なく通る

f:id:konohazukux:20180606164124p:plain

■ let変数の前にメソッドをcall

Use of 'self' in method call 'bind' before all stored properties are initialized
「全てのプロパティーが初期化される前にメソッドをcallするときはselfを使え」とのこと

f:id:konohazukux:20180606164317p:plain

■ selfをつけてみる

=>selfをつけても結果は同じ。。? f:id:konohazukux:20180606164542p:plain

継承しているパターン

■ 継承してサブクラスにした場合

=> 先にsuper.init を呼べとのこと

f:id:konohazukux:20180606164832p:plain

■ メソッドを呼ぶ前にsuper.initを呼ぶ。

=> これはOK

f:id:konohazukux:20180606165051p:plain

■ let定数の前にsuper.initをよんでみた。

=> これはダメとのこと

f:id:konohazukux:20180606165145p:plain

■ メソッドよびだしの後にsuper.initを呼んでみた

f:id:konohazukux:20180606165336p:plain

=> ダメ