40
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Organization

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

初期化するとき

例えば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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
40
Help us understand the problem. What are the problem?