enumは独自のメソッドやプロパティも持ててしまえるので、swiftでは非常に強力な武器となりました。
下記の画像のようなUIButtonなど利用するtagをenumで管理する方法を例にenumの使い方などを見て行きたいと思います。
ボタンによってアクションが微妙に異なる場合などはタグ番号を振っておくとアクション先のメソッドで判別できて便利です。
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にコピペすればサンプルを動かせます。)
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.
}
}