Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

【Swift】Swift5.1からstructのイニシャライザの自動生成でプロパティのデフォルト値が考慮されるようになった

はじめに

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のリンクを記載していますので、興味がある方はぜひ見てみてください。

参考