Objective-Cでお馴染みのenum。Swiftのenumでは同等以上の機能が用意されています。

整数型(Int型)かつ連番で定義する

一番使うのがこのパターンでしょう。

enum WineType: Int {
    case Red = 1
    case White
    case Sparkling
}

// このように書くこともできます。
enum WineType2: Int {
    case Red = 1, White, Sparkling
}
// wineTypeはWineType型になります。
var wineType = WineType.Red
// 明示的に宣言する場合は以下のようにします
var wineType: WineType = WineType.Red
// WineType型変数への代入は以下のように省略した書き方ができる
wineType = .White

EnumのInt値を得る

Objective-Cのenumと異なるのは、実体はIntなどではなくオブジェクトだということです。よって以下のように直接Intへセットしようとするとコンパイルエラーになります。

var value: Int = WineType.Red

Int値を取得する場合は、rawValueプロパティを使います。

var value: Int = WineType.Red.rawValue
// もしくは以下のように書く。valueは自動的にInt型となる
var value = WineType.Red.rawValue

ちなみにenumそのものはオブジェクトですが、AnyObjectへは代入できません。以下はコンパイルエラーです。

var object: AnyObject = WineType.Red

Int値からEnumへ変換する

DatabaseにEnum値を保存するときはrawValueを通じてIntで保存する事になると思います。それを読み出すときにIntからEnumへ変換する必要があります。その場合は以下のようにします。

// rawValueにInt値を指定
// この場合type1はWineType?型になることに注意
// rawValueがEnumに変換できないならnilを返す
var type1 = WineType(rawValue: 1)
// アクセスするには!もしくは?をつける必要がある
var value = type1!.rawValue
// rawValueが確実にEnumに変換できるとわかっているなら!をつけると良い
var type2 = WineType(rawValue: 2)!
// !や?はつけなくてよい
var value = type2.rawValue

Int型以外のenum宣言

以下のように文字列のenumを定義することもできます

enum WineTypeName: String {
    case Red = "Red"
    case White = "White"
    case Rose = "Rose"
    case Sparkling = "Sparkling"
}

この場合、rawValueはString型になります。

// str1はString型となる
var str1 = WineTypeName.Red.rawValue

Int同様にStringからenum型への復元もできます

// wineTypeNameはWineTypeName.Sparklingとなる
var wineTypeName = WineTypeName(rawValue: "Sparkling")!

純粋なenumオブジェクトとしての宣言

IntやStringを指定せずにenum宣言することも可能です。

enum WineType {
    case Red, White, Rose, Sparkling
}

この場合、rawValueパラメータは使えません。hashValueというプロパティは使えて、これは宣言した順番に0から連番が振られるようです。ただそれを期待して使うのもよろしくないと思います。連番を振りたいなら、やはりInt指定でenum宣言したほうがよいでしょう。

特にDatabaseなどに保存する必要がないものは、Intも何も指定せずにenum宣言しても良いと思います。

switch文

switch文では以下のように省略参照を使って手軽に書くことができます。

var wineType = WineType.Red
switch wineType {
case .Red:
   return "Red"
case .White:
   return "White"
default:
   return "Not Red and White"
}

enumにメソッドを追加する

enumはクラス同様にプロパティやメソッドを追加することができます。

enum WineType: Int {
    case Red = 1, White, Rose, Sparkling

    // 実装型のプロパティの宣言
    var name: String {
        get {
            switch self {
            case .Red:
                return "Red"
            case .White:
                return "White"
            case .Rose:
                return "Rose"
            case .Sparkling:
                return "Spakling"
            }
        }
    }

    // これはコンパイルエラー。
    // 変数型のプロパティは宣言できない。
    var name2: String = "name2"

    // メソッドの宣言
    func isNotSparkling() -> Bool {
        return self != .Sparkling
    }
}

ただし、enumにメソッドを追加したくなったときは、それはclassで宣言した方がふさわしいのではないかを考える必要があります。enumは継承もできません。

// これはコンパイルエラー
enum SubWineType: WineType {
}

enumはその名の通り、あくまで列挙型として使用するのが望ましいはずです。