*

Swiftの列挙型、switch文、網羅性チェックが素晴らしい!

公開日: : iPhoneアプリ開発

アップルの新プログラミング言語「Swift」をちょっとずついじってるんですが、列挙型とswitch文がなかなか便利になっていたので紹介したいと思います!

    


Objective-Cの列挙型

Objective-Cにおける列挙型の定義は、以下のように書きます。

typedef enum : NSUInteger {
    ColorTypeRed,
    ColorTypeGreen,
    ColorTypeBlue,
} ColorType;

    

例えば以下のように2つの列挙型を定義すると、BackgroundColorのRed, Green, Blueは二重定義ということで「Redefinition of enumerator ‘Red’」などのエラーが出てしまいます。

typedef enum : NSUInteger {
    Red,
    Green,
    Blue,
} TextColor;

typedef enum : NSUInteger {
    Red,
    Green,
    Blue,
} BackgroundColor;

    

これを回避するため、以下のように接頭辞を付けて名前が被らないようにする必要があります。

typedef enum : NSUInteger {
    TextColorRed,
    TextColorGreen,
    TextColorBlue,
} TextColor;

typedef enum : NSUInteger {
    BackgroundColorRed,
    BackgroundColorGreen,
    BackgroundColorBlue,
} BackgroundColor;

    

列挙型への代入は以下のように書きます。

ColorType color = ColorTypeBlue;

    

列挙型の値によってswitch文で分岐するには、以下のようなコードを書きます。

switch (color) {
    case ColorTypeRed:
        NSLog(@"赤");
        break;
    case ColorTypeGreen:
        NSLog(@"緑");
        break;
    case ColorTypeBlue:
        NSLog(@"青");
        break;
}

    

定義・代入・switch文などのすべてで接頭辞(ColorType…, TextColor…, BackgroundColor…)を何度も入力しなければならないので面倒くさいです。

    

Swiftの列挙型

Swiftにおける列挙型の定義は、以下のように書きます。

enum ColorType {
    case Red
    case Green
    case Blue
}

    

Swiftでは値の名前が被ったとしても接頭辞を付ける必要はありません。

enum TextColor {
    case Red
    case Green
    case Blue
}

enum BackgroundColor {
    case Red
    case Green
    case Blue
}

    

値を利用する際は、以下のように型名を先頭につけて区別します。

var color = ColorType.Blue
var textColor = TextColor.Blue
var backgroundColor = TextColor.Blue

    

変数の型名を明示的に指定する場合は、値の先頭に型名を付けなくても良いようです。

var color:ColorType = .Blue
var textColor:TextColor = .Blue
var backgroundColor:TextColor = .Blue

    

switch文のcaseでも、型名の指定は不要です。ちなみにSwiftのswitch文では、breakを付けなくてもbreakします。

switch color {
case .Red:
    NSLog("赤")
case .Green:
    NSLog("緑")
case .Blue:
    NSLog("青")
}

    

型名を接頭辞として付けなくても良くなったので、コードがシンプルで読みやすくなっていると感じます。

    

switch文の網羅性チェックが素晴らしい

Swiftのswitch文には「網羅性チェック」という機能が備わっており、これがなかなか素晴らしいです。

    

例えばObjective-Cで以下のようなコードを書いたとします。

typedef enum : NSUInteger {
    ColorTypeRed,
    ColorTypeGreen,
    ColorTypeBlue,
} ColorType;

switch (color) {
    case ColorTypeRed:
        NSLog(@"赤");
        break;
    case ColorTypeGreen:
        NSLog(@"緑");
        break;
    case ColorTypeBlue:
        NSLog(@"青");
        break;
}

    

その後、ColorTypeの値を以下のように増やしたとします。

typedef enum : NSUInteger {
    ColorTypeRed,
    ColorTypeGreen,
    ColorTypeBlue,
    ColorTypeYellow,
} ColorType;

    

ColorTypeYellow向けの処理をswitch文に追加し忘れた場合、プログラムが正しく動作しなくなる可能性があります。基本的にはコーディングする人間がこれをチェックしなければならないわけですが、人間はミスをするので安全とは言えません。

    

それに対してSwiftで同様のことを行ったとしましょう。

enum ColorType {
    case Red
    case Green
    case Blue
    case Yellow
}

switch color {
case .Red:
    NSLog("赤")
case .Green:
    NSLog("緑")
case .Blue:
    NSLog("青")
}

    

するとswitch文で以下のようなエラーが出ます。

Switch must be exhaustive, consider adding a default clause

    

このエラーを解決するには、.Yellowのcaseを追加するか、

switch color {
case .Red:
    NSLog("赤")
case .Green:
    NSLog("緑")
case .Blue:
    NSLog("青")
case .Yellow:
    NSLog("黄")
}

    

defaultを追加します。

switch color {
case .Red:
    NSLog("赤")
case .Green:
    NSLog("緑")
case .Blue:
    NSLog("青")
default:
    NSLog("その他の色")
}

    

つまり、Swiftのswitch文で列挙型を判定条件に使った場合、すべての値に対する処理が用意されているかを自動でチェックしてくれて、漏れがあればエラーで教えてくれるわけです。これにより、より安全なコードが書けそうです。

    

アキオはこう思った。

Swiftは「モダン、安全、高速、インタラクティブ」を大きな特徴として挙げていますが、今回紹介したswitch文の網羅性チェックはより安全なコードを書くための機能として追加されたのだと思います。

次に作るアプリはSwiftを使ってコードを書こうかなと思ってます!

次回更新予定

「パンダのトーストの作り方」

更新したらお知らせしますので、気になる方は下のボタンからフォローを!

follow us in feedly

関連記事

20140901-120049

デザイン初心者な僕がデザイナーさんにそこそこ褒められるアプリアイコンを作った方法

デザイン初心者の僕がアプリアイコンを作ったら、本職のデザイナーさんにそこそこ褒められるという嬉しい体

記事を読む

20140907-151346.jpg

67才プログラミングほぼ未経験にしてiPhoneアプリをリリースした方に色々聞いてみた

今日は、僕が講師をしているiPhoneアプリ開発講座「アプリクリエイター道場 開発塾」を受講して、つ

記事を読む

Auto LayoutやStoryboardの仕組みをしっかり理解できる!「UIKit徹底解説」

インプレスジャパン様より献本御礼。UIKit周りを中心に、「Auto Layout」「Story

記事を読む

エディタのショートカット・Auto Layout・ブレークポイントに関する詳しい解説も!「Xcode5徹底解説」

著者の@es_kumagaiさんより献本御礼。iOSアプリ開発に用いるツール「Xcode 5」の

記事を読む

iPhoneアプリ開発の初心者にオススメな本はこれだ!iOS 7とXcode 5に対応!

僕が講師をしている初心者向けのiPhoneアプリ開発講座「アプリクリエイター道場」でも参考書とし

記事を読む

20140905-180905.jpg

英語苦手な人がSwiftを学びたいならこの本を読むといいよ!

アップルのWWDC2014で発表された、iOSおよびOS Xのためのプログラミング言語「Swift」

記事を読む

20140724-103334.jpg

iPhoneアプリ開発にオススメの本10選(2014年7月版)

2013年12月に「レベル・目的別!iPhoneアプリ開発おすすめ本19冊(2013年12月

記事を読む

20140818-141439.jpg

iPhoneアプリを作りたい開発初心者にまずはやってみて欲しい3つのこと

今日は、これからiPhoneアプリを作りたい開発初心者の方にやってもらいたいことを書いてみたいと

記事を読む

20140807-182914.jpg

【アプリ開発】iOS 8とiOS 7でUIAlertController・UIAlertView・UIActionSheetを切り替えて使う方法

今までお世話になったUIAlertViewとUIActionSheetがiOS 8からはde

記事を読む

iPhoneゲームを簡単に開発したいならこの本がオススメ!「Sprite Kit iPhone 2Dゲームプログラミング」

iPhoneゲームアプリを簡単に開発したいなら「Sprite Kit iPhone 2Dゲームプ

記事を読む

20140916-130550
Swiftの列挙型、switch文、網羅性チェックが素晴らしい!

アップルの新プログラミング言語「Swift」をちょっとずついじってるん

20140910-002155.jpg
【派手髪】下北沢の美容室で紫とアフターミッドナイトに染めてもらった!【マニパニ】

9月5日、僕がいつも通っている下北沢の美容室「VIVA CUTE CA

20140907-200541.jpg
白玉がモチモチ!セブンイレブンのクリーム白玉ぜんざい(栗入り)を食べてみた

セブンイレブン「クリーム白玉ぜんざい(栗入り)」を食べてみました!秋っ

20140907-151346.jpg
67才プログラミングほぼ未経験にしてiPhoneアプリをリリースした方に色々聞いてみた

今日は、僕が講師をしているiPhoneアプリ開発講座「アプリクリエイタ

20140906-130908.jpg
セブンイレブンの「お抹茶ばばろあ」を食べてみた

セブンイレブンの和スイーツ「お抹茶ババロア」を食べてみました!   

→もっと見る

PAGE TOP ↑