はじめに
Swiftで使用されるstructは定義したプロパティにしたがってイニシャライザメソッドが自動生成されます。 例えば下記のようにUserを定義した場合に自動でイニシャライザが生成されます。
struct User { var id: Int var name: String } // init(id: Int, name: String)が自動生成されている let user = User(id: 0, name: "Tanaka")
この自動生成処理に関して、Swift5.1で変更があったため記載します。
環境設定
以下の環境を使用しています。
- Swift5.1
Swift5.1での変更点
Swift5.1以前では以下のようにstructのプロパティにデフォルトの値を設定していた場合でも、デフォルトの値を考慮したイニシャライザは自動生成されませんでした。
struct User { var id: Int var name: String = "unknown" } // init(id: Int, name: String = "unknown")は自動生成されず、 // init(id: Int, name: String)しか生成されていないため、 // Swift5.1以前では以下の初期化はコンパイルエラーになる let userA = User(id: 1)
そのため今までであれば、該当のイニシャライザが欲しければ自分で以下のように定義するしかありませんでした。(※小ネタですが、structのextensionにイニシャライザを書くことで、自動生成されるイニシャライザも使用できます。struct定義内にイニシャライザを書くと自動生成が行われません)
extension User { init(id: Int) { self.id = id } }
この点に関してSwift5.1で変更があり、デフォルト値が設定されているプロパティを考慮したイニシャライザが生成されるようになりました。
struct User { var id: Int var name: String = "unknown" } // init(id: Int, name: String = "unknown")が自動生成されているため、 // 以下の初期化処理がどちらもコンパイルエラーにならずに成功する let userA = User(id: 0) let userB = User(id: 1, name: "Tanaka")
まとめ
structがより便利に使いやすくなりました。参考にプロポーザルと対応するPRのリンクを記載していますので、興味がある方はぜひ見てみてください。
参考
- SE-0242 Synthesize default values for the memberwise initializer
- 本記事に記載した内容のProposalです。
- [Sema] Synthesize default values for memberwise init
- 本記事記載内容のSwift RepositoryへのPRです。