Edited at

SwiftではEnumにコンストラクタが書ける

More than 3 years have passed since last update.


初期化するとき

例えばenumを変数として保持しておいて、どこかのタイミングで書き換えるみたいなケース。最初に変数を宣言するときは初期値は入れておきたいのでこんな風に書きますよね。同僚に教えてもらうまではこんな風に書いていました。

enum Size {

case Small, Medium, Large
}

var size = .Small // .Smallで初期化

これでも問題はないっちゃないんですが、デフォルト値は.Smallであるという情報はここには現れていません。


引数なしコンストラクタ

enumにはinitで以下のようにコンストラクタが定義できます。

enum Size {

case Small, Medium, Large

// 引数なしコンストラクタ
init() {
self = .Small
}
}

var size = Size() // -> .Smallが設定される

これであればデフォルト値は.Smallであるという意図がより伝わりやすいと思います。


引数ありコンストラクタ

引数ありのコンストラクタも作れます。コンストラクタが設定できることを教えてもらうまではわざわざメソッドを作っていましたが、コンストラクタの方がより意図が伝わりやすいと思います。

enum Size {

case Small, Medium, Large

// 引数ありコンストラクタ
init(height: Int) {
if height < 160 {
self = .Small
} else if height < 170 {
self = .Medium
} else {
self = .Large
}
}
}

var size = Size(height: 190) // -> .Large


失敗するかもしれないコンストラクタ

さらには失敗するかもしれない(nilが返ってくるかもしれない)コンストラクタも作ることができます。その場合は、initの後ろに?をつけてinit?と宣言します。

enum Size {

case Small, Medium, Large

// 失敗するかもしれないコンストラクタ
init?(height: Int) {
if height < 160 {
self = .Small
} else if height < 170 {
self = .Medium
} else if height < 180 {
self = .Large
} else {
return nil
}
}
}

var size = Size(height: 190) // -> nil