はじめに
イニシャライザについてまとめた記事です。
環境
この記事の情報は次のバージョンで動作確認しています。
イニシャライザとは
- 変数を初期化するためのメソッド
- 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のフォローもお願いします。