47
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-26

初期化するとき

例えば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
47
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?