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コード)

関連記事

I20160130-110811.jpg

【解決】Redundant conformance of ‘NSDate’ to protocol ‘Comparable’エラーが出た時の対処方法

アプリ開発中に「Redundant conformance of 'NSDate' to pro

記事を読む

I20160119-155700.jpg

Xcodeで80文字目のところにガイドラインを表示する方法

Xcodeで80文字目のところに線(ガイドライン)を表示する方法について解説します! 「ソース

記事を読む

20160807-113229.jpg

UITableViewのリサイズに合わせて一番下のセルを常に一番下に表示する方法

一番下のセルを表示している状態でUITableViewの下端を上に移動させると一番下のセルが隠れ

記事を読む

I20151202-232710.jpg

【Swift 2】配列(Array)を初期化する方法

Swiftで配列(Array)を初期化する方法についてまとめてみたいと思います!   

記事を読む

I20151030-214417.jpg

【開発本】SpriteKitの入門書籍「iPhoneのゲームアプリをつくろう!」

SwiftとSpriteKitでiPhoneゲームアプリを開発するための入門書「iPhone

記事を読む

I20151122-213340.jpg

【入門本】詳細! Swift 2 iPhoneアプリ開発 入門ノート Swift 2 + Xcode 7対応

ソーテック社より「詳細! Swift 2 iPhoneアプリ開発 入門ノート Swift

記事を読む

I20160411-122213.jpg

Swift 2.2の変更点をまとめてみた

2016年3月22日、Xcode 7.3と共にSwift 2.2が正式にリリースされました。

記事を読む

20140721-170305.jpg

プロトタイピングのツールや手法を学べる「プロトタイピング実践ガイド」

株式会社インプレスさまより献本御礼。 プロトタイピング実践ガイド スマホアプリの効率的なデザイ

記事を読む

I20150722-185359.jpg

【書籍】12のパターンで学ぶ本「iOSアプリ開発 AutoLayout徹底攻略」

     Auto Layoutの使い方について解説されている本「iOSアプリ開発 A

記事を読む

I20160210-140020.jpg

【Xcode】モーダル表示で遷移先へ値を渡す時のハマりポイント

モーダル表示で遷移先の画面へ値を渡す際、最初はハマりやすいポイントについて解説したいと思いま

記事を読む

20170423-182541
良肌研究室のフェイスウォッシュとオールインワンジェルを使ってみた

株式会社ブラシナさんから、良肌研究室の商品をご提供頂いたので、

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で、タブバーアイコン非選択時の

→もっと見る

PAGE TOP ↑