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

関連記事

20150327-131839.jpg

【Apple Watchアプリ】ボタン内の文字の先頭に画像を入れる方法【WatchKit】

Apple Watch向けのアプリを作るためのフレームワーク「WatchKit」。そのWatch

記事を読む

I20160130-110811.jpg

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

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

記事を読む

I20150909-225806.jpg

Functional Programming in Swiftを読むために、すごいH本を読み終えた感想

「Functional Programming in Swift」という本がありまして、

記事を読む

I20160525-233821.jpg

SwiftBondを使ってみた。observeやObservableの使い方など

Swiftバインディングフレームワークである「SwiftBond」を使ってみました!

記事を読む

I20160204-120840.jpg

Swiftでプロトコル型に対して===演算子を使いたい時の対処法

プロトコル型の変数や定数に対して===演算子を使うと「error: binary opera

記事を読む

I20160918-133158.jpg

StoryboardでChild View Controllerにデータを渡す方法(Xcode 8 & Swift 3)

Storyboardで、Child View Controllerにデータを渡す方法を紹介します

記事を読む

20140905-180905.jpg

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

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

記事を読む

20141222-120336.jpg

【Swift】PlaygroundでUIImageに画像を読み込む方法

SwiftのPlayground内にて、UIImageに画像ファイルを読み込む方法を紹介しま

記事を読む

I20151030-214417.jpg

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

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

記事を読む

I20151202-232710.jpg

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

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

記事を読む

I20170521-225453.jpg
東京駅八重洲口の「羊肉酒場 悟大」で網焼きジンギスカンを頂きました!

ゆうせいさんと株式会社 大庄さんからご招待頂き、悟大withサッポ

I20170514-165235.jpg
iPhoneと連携できる体重体組成計「Withings Body Cardio」を使ってます

ジムに通い始めて体脂肪率が落ち始めたのをキッカケに、iPhoneと

I20170507-155440.jpg
【派手髪】ハーレイクイン風の髪色に染めてもらいました

2016年10月20日、ハーレイクイン風の髪色に染めてもらいました

I20170504-173110.jpg
【メンズネイル】東京・新宿のネイルサロンでターコイズのホログラムネイルしてもらった

ネイルネタが1年分くらい溜まっているので、ちょっとずつ書いていこう

I20170502-010117.jpg
SNUGGのライトニングケーブルが耐久性高し。8ヶ月使ってますが断線の気配なし!

iPhoneの充電&転送ケーブルであるLightningケーブルっ

→もっと見る

PAGE TOP ↑