初期化するとき
例えば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