[Swift] enumって便利！UIButton.tagの管理手法からenum型の使い方を理解する

enumは独自のメソッドやプロパティも持ててしまえるので、swiftでは非常に強力な武器となりました。
下記の画像のようなUIButtonなど利用するtagをenumで管理する方法を例にenumの使い方などを見て行きたいと思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/24308/4881e704-e553-e14f-467b-45597b9cf4c9.png)

ボタンによってアクションが微妙に異なる場合などはタグ番号を振っておくとアクション先のメソッドで判別できて便利です。



# enumを定義
```swift
enum BtnTag: Int {
    case Zero = 1, One, Two, Three, Other
}
```

タグ番号Int型なので0から設定可能ですが、**0はデフォルト値のためタグ番号としては使用しないほう**が懸命です。そのため先頭に1を割り当てました。

# enum内に配列の変数を作り、UIButtonを生成する
次にviewにUIButtonを追加してみましょう。
０〜３までとotherの５つのボタンを作ります。
enumを直接for inすることは出来ませんので、今回はenumに割り当てた要素を配列（allValue）としてenum内に作ってしまいましょう。

```swift
enum BtnTag: Int {
    case Zero = 1, One, Two, Three, Other
    static let allValues = [Zero, One, Two, Three, Other]

}
```

（要素の数がおおい場合は、配列の生成をプログラマブルにやる必要があると思いますが、今回はシンプルにそのまま書きます）

そしてfor inでBtnTag.allValueを回してボタンを追加していきます。

```swift
for btag in BtnTag.allValues {
    var y = CGFloat(60 * btag.rawValue - 1)
    var btn = UIButton(frame: CGRectMake(50, y, 50, 50))
    btn.backgroundColor = UIColor.redColor()
    btn.tag = btag.rawValue
    self.view.addSubview(btn)
}

```

このような形でボタンを生成する事ができました。そしてtagにbtag.rawValue（Int型）を渡してタグ番号を指定出来ました。


# enumに便利なメソッドを書く
次にボタンのテキストです。今回のenumでは０〜３とotherがありますので、enumのクラス内にStringに変換して取得できるメソッドを追加したいと思います。

```swift
enum BtnTag: Int {
    case Zero = 1, One, Two, Three, Other
    static let allValues: [BtnTag] = [Zero, One, Two, Three, Other]
    
    func toStr() -> String {
        if self == Other {
            return "other"
        }else{
            return String(self.rawValue - 1)
        }
    }
}
```

ボタンの方は以下のようにテキストを追加します。

```swift
for btag in BtnTag.allValues {
//略
    btn.setTitle(btag.toStr(), forState: .Normal)
//略
}
```


# tag番号からenumを取得する
最後に押された時のアクションです。
アクションにsenderとしてUIButtonが送られてきます。sender.tagでタグ番号を取得できるので、逆にタグ番号からenuｍを取り出す方法をみてみましょう。

```swift
func pushed(sender: UIButton){
    var btag = BtnTag(rawValue: sender.tag)!

    if btag == .Other {
        println("Other Button pushed!")
    }else{
        println("Pushed Number is " + btag.toStr())
    }
}
```

enumはrawValueによって初期化することが可能です。このようにtagによってアクションの処理を変える事が可能です。


---
以上、enumを使ったUIButtonなどタグ管理方法でした。
サンプルコードの全文つけておきます。（ViewControllerにコピペすればサンプルを動かせます。）

```swift:ViewController.swift
import UIKit


enum BtnTag: Int {
    case Zero = 1, One, Two, Three, Other
    static let allValues: [BtnTag] = [Zero, One, Two, Three, Other]
    
    func toStr() -> String {
        if self == Other {
            return "other"
        }else{
            return String(self.rawValue - 1)
        }
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        for btag in BtnTag.allValues {
            var y = CGFloat(60 * btag.rawValue - 1)
            var btn = UIButton(frame: CGRectMake(50, y, 50, 50))
            btn.backgroundColor = UIColor.redColor()
            btn.tag = btag.rawValue
            btn.setTitle(btag.toStr(), forState: .Normal)
            btn.addTarget(self, action: "pushed:", forControlEvents: .TouchUpInside)
            self.view.addSubview(btn)
        }
        // Do any additional setup after loading the view, typically from a nib.
    }

    func pushed(sender: UIButton){
        var btag = BtnTag(rawValue: sender.tag)!

        if btag == .Other {
            println("Other Button pushed!")
        }else{
            println("Pushed Number is " + btag.toStr())
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```