技術はメシのタネ

底辺プログラマで技術の向上を目指しているけれどやりたい事が無くて困っている

しょうもないけど知らないとできないSwiftの初期化

はい、おばんですー。
時間がないのでさくっとねー。

こんなソース書いちゃうやつでもプログラマとして働けるので、みんなもっと勇気を持って欲しい(イミフ

環境はXcode6.3。

class TestApp {
    var hoge: Int
    
    init() {
        self.setValue()
    }
    
    func setValue() -> Void {
        self.hoge = 0
    }
}

こうやるとこういう風に怒られる。

  1. Return from initializer without initializing all stored properties
    'self.hoge' not initialized
  2. Use of 'self' in method call 'setValue' before all stored properties are initialized
    'self.hoge' not initialized
  3. Variable 'self.hoge' used before being initialized

要するに、初期値入れろや、と怒られているっぽい。
しかし、初期化自体はsetValue()でやってるっしょ?

なんで怒られなあかんの。

というわけで、変数"hoge"をオプショナルにしてみたりガード式入れてみたりといろいろしてみたのだが、どうあってもエラーが消えない。

正解


保存型プロパティは、宣言時のデフォルト値か、初期化関数内で初期値の設定しないとダメなんだってさ。
あくまでinit()の中で初期化するのが正しいのであって、そっから先呼ばれるメソッド内で初期化するのはあかんらしい。
ここで言う保存型プロパティっていうのはメンバ変数"hoge"のこと。

class TestApp {
    var hoge: Int
    
    init() {
        self.hoge = -1
        self.setValue()
    }
    
    func setValue() -> Void {
        self.hoge = 0
    }
}


さらに、初期化関数内で初期値を設定するよりは、宣言時にデフォルト値として与える方が望ましいらしい。

class TestApp {
    var hoge: Int = -1
    
    init() {
        self.setValue()
    }
    
    func setValue() -> Void {
        self.hoge = 0
    }
}

以上。
寝るです。