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

公開日: : 最終更新日:2016/02/10 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文で列挙型を判定条件に使った場合、すべての値に対する処理が用意されているかを自動でチェックしてくれて、漏れがあればエラーで教えてくれるわけです。これにより、より安全なコードが書けそうです。

    

@akio0911はこう思った。

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

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

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

関連記事

I20150907-185322.jpg

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」

株式会社マイナビ様より献本御礼。 本書は、公式のUIフレームワーク「Unity UI(uGUI

記事を読む

20160309-131202.jpg

ゆるい入門書では物足りない人向けの濃い内容!「本気ではじめるiPhoneアプリ作り」

ヤフー株式会社のiOSエンジニアである西 磨翁(にし まお)さんより、「本気ではじめるiPhon

記事を読む

20141224-231137.jpg

【Swift】Auto Layoutで特定のデバイス・画面サイズの時だけ制約を変更する方法

Auto Layoutで、特定のデバイスや画面サイズの時だけ制約を変更する方法について紹介したい

記事を読む

I20151201-120520.jpg

【Swift 2】switch内にてguardでbreakする

Swift 2のguard内ではreturnしないと文法エラーとなりますが、実はswitch

記事を読む

I20160212-000722.jpg

Swiftにおけるセレクタ(Selector)について調べてみた

NSTimerなどを使う際、引数に「Selector」という型があるのですが、これがSwiftで

記事を読む

I20160409-211651.jpg

Xcode 7.3の新機能についてまとめてみた

2016年3月22日にXcode 7.3がリリースされましたが、自分が知らない機能があるかもしれ

記事を読む

I20150808-104713.jpg

【Xcode】シミュレーターリストの表示がおかしくなった時の解決方法

Xcodeのシミュレーターリストの表示が、上のスクリーンショットのようにおかしくなってしまっ

記事を読む

20160802-232454.jpg

【Xcode 7】メソッドがどこから呼びだされているかを調べる方法

Xcode 7で、メソッドがどこから呼び出されているのか調べる方法を紹介します!     方法

記事を読む

20141227-125250.jpg

実践的な内容まで載っている!開発のプロが教える Swift標準ガイドブック

株式会社マイナビ様より「開発のプロが教える Swift標準ガイドブック」の見本紙を頂きました。早

記事を読む

I20151102-201945.jpg

Swift 2の文法を学べるオススメ本「Swift 2標準ガイドブック」

Swift 2の文法について学べる書籍「Swift 2標準ガイドブック」が発売されたので、紹介し

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑