バッテラが如く

プログラミングしましょ!

【Swift】イニシャライザ(init)の基礎

はじめに

イニシャライザについてまとめた記事です。

環境

この記事の情報は次のバージョンで動作確認しています。

* MacOS Monterey (12.1)
* Xcode (13.3.1)

イニシャライザとは

  • 変数を初期化するためのメソッド
  • struct(構造体)、class(クラス)で持つことができる

下記コードでいうinitの部分がイニシャライザになります。

class Hoge {
    
    var value_1: Int
    
    init(arg: Int) {
        self.value_1 = arg
    }
}

オーバーライド(多重定義)もできる

initをオーバーライド(多重定義)することができます

class Hoge {
    
    var value_1: Int
    var value_2: Int?
    
    init(arg: Int) {
        self.value_1 = arg
    }
    
    init(arg1: Int, arg2: Int) {
        self.value_1 = arg1
        self.value_2 = arg2
    }
}

classのinit内で別のinitを呼びたい場合は

次のコードはエラーになります

    init(arg1: Int, arg2: Int) {
        //self.value_1 = arg1
        self.init(arg: arg1)
        self.value_2 = arg2
    }

// Designated initializer for 'Hoge' cannot delegate (with 'self.init'); did you mean this to be a convenience initializer?

init内で他のinitを呼び出すことができないというエラーです。

じゃあどうすればいいかというとinitの前にconvenienceをつけます

 convenience init(arg1: Int, arg2: Int) {
        //self.value_1 = arg1
        self.init(arg: arg1)
        self.value_2 = arg2
    }

但し!

これはclassの場合の話です。structの場合はなぜかエラーになります。アハハ

structのinit内で別のinitを呼びたい場合は

struct(構造体)の場合はconvenienceをつけなければいいみたいです。

    init(arg1: Int, arg2: Int) {
        //self.value_1 = arg1
        self.init(arg: arg1)
        self.value_2 = arg2
    }

classかstructで実装方法が異なるのが罠ですね

おわりに

最後まで見ていただきヘペトナス!

読者登録・Twitterのフォローもお願いします。