LoginSignup
51
46

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-21

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

image

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

enumを定義

enum BtnTag: Int {
    case Zero = 1, One, Two, Three, Other
}

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

enum内に配列の変数を作り、UIButtonを生成する

次にviewにUIButtonを追加してみましょう。
0〜3までとotherの5つのボタンを作ります。
enumを直接for inすることは出来ませんので、今回はenumに割り当てた要素を配列(allValue)としてenum内に作ってしまいましょう。

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

}

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

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

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では0〜3とotherがありますので、enumのクラス内にStringに変換して取得できるメソッドを追加したいと思います。

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)
        }
    }
}

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

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

tag番号からenumを取得する

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

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にコピペすればサンプルを動かせます。)

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.
    }


}
51
46
2

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
51
46