2016/07/01更新

[Swift] Enum(列挙型)に入門する

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
どの言語でもよく利用されるEnum(列挙型)ですが、Swiftでの使い方を学んだのでブログに残しておきたいと思います。

画像


目次




Enumを定義する/利用する

Swiftで列挙型を使う場合には、以下のように定義することで利用できます。
enum Color {
    case Blue
    case Red
    case Yellow
}
または、case文を1行で以下のように書くこともできます。
enum Color {
    case Blue, Red, Yellow
}
どっちで書いてもいいですが、個人的にはcase毎に行を分ける方が読みやすい気がします。

列挙型を使うには以下のように行います。
// 列挙型を変数に代入する
let color1 = Color.Blue

// 変数の型が指定されている場合には、.RedとEnum名を省略できる
let color2: Color = .Red

// 出力するとプロパティ名が見える(あまり使いませんが)
print(color1, color2) // Blue Red



Enumの中身の型を指定する

以下のようにすることで、Enumの中身の型を指定することができます。
// Int型を指定した例
enum Status: Int {
    case Valid
    case Invalid
}
型を指定すると、rawValueプロパティを使って値を取り出すことができるようになります。
let status1 = Status.Valid
let status2 = Status.Invalid
print(status1.rawValue) // 0
print(status2.rawValue) // 1
また、値からEnumを取得することもできます。
let status1 = Status.init(rawValue: 0)
print(status1) // Optional(Status.Valid)
let status2 = Status.init(rawValue: 0)
print(status2) // Optional(Status.Invalid)

// 存在しない数値を指定したら、nilになります
let status3 = Status.init(rawValue: 10)
print(status3) // nil



Enumの中に独自関数を定義する

SwiftのEnumでは、Enum内に独自関数を定義することができます。
enum Signal: String {
    case Blue = "進め"
    case Yellow = "注意"
    case Red = "止まれ"

    // 独自関数を定義
    func say() {
        print(self.rawValue + "だよー")
    }
}
そして、以下のように呼び出すことができます。
let signal1 = Signal.Blue
signal1.say() // 進めだよー



Enumのプロパティ毎に異なる値を持たせる

これはなかなか独特ですが、SwiftのEnumではプロパティ毎に異なる情報を保持させることができます。
enum Job {
    case Planner
    case Designer(String, Int)
    case Engineer(String, Int, String)
}

let job1 = Job.Planner
let job2 = Job.Designer("Web系", 400)
let job3 = Job.Engineer("ゲーム系", 500, "大変だ")
print(job1) // Planner
print(job2) // Designer("Web系", 400)
print(job3) // Engineer("ゲーム系", 500, "大変だ")
これをどうやって使うんだろうと思っていたら、どうもswitch文で使えるようです。
switch(job2) {
    case let .Designer(name, salary):
        print("Designer: \(name) \(salary)") // Designer: Web系 400
        break
}
また、以下のように名前付きの引数にすることもできるようです。
enum Direction {
    case North(direction: String, message: String)
}

let direction = Direction.North(name: "北", description: "危ない方向")
いろいろとSwiftのEnumはできるなーと思いました。



参考資料

この記事を書くために、以下の記事を参照しました。ありがとうございます。
The Swift Programming Language (Swift 2.2): Enumerations

また、以下の記事ではさらに詳しくEnumを説明していますので、気になる方は見てみてください。
Swiftの列挙型(enum)おさらい - Qiita



最後に

列挙型はいろいろな言語で使いますが、SwiftのEnumはいろいろと柔軟に作られていますね。Enumの定義位置も、グローバルはもちろんの事、クラス内やメソッド内でも定義できる柔軟性があります。便利なので今後いろいろと使ってみようと思います。

最後になりますが本ブログでは、Swift・Python・Java・フロントエンド・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。