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を使ってコードを書こうかなと思ってます!
関連記事
-
-
デザイン初心者な僕がデザイナーさんにそこそこ褒められるアプリアイコンを作った方法
デザイン初心者の僕がアプリアイコンを作ったら、本職のデザイナーさんにそこそこ褒められるという嬉しい体
-
-
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アプリ開発講座「アプリクリエイター道場」でも参考書とし
-
-
英語苦手な人がSwiftを学びたいならこの本を読むといいよ!
アップルのWWDC2014で発表された、iOSおよびOS Xのためのプログラミング言語「Swift」
-
-
iPhoneアプリ開発にオススメの本10選(2014年7月版)
2013年12月に「レベル・目的別!iPhoneアプリ開発おすすめ本19冊(2013年12月
-
-
iPhoneアプリを作りたい開発初心者にまずはやってみて欲しい3つのこと
今日は、これからiPhoneアプリを作りたい開発初心者の方にやってもらいたいことを書いてみたいと
-
-
【アプリ開発】iOS 8とiOS 7でUIAlertController・UIAlertView・UIActionSheetを切り替えて使う方法
今までお世話になったUIAlertViewとUIActionSheetがiOS 8からはde
-
-
iPhoneゲームを簡単に開発したいならこの本がオススメ!「Sprite Kit iPhone 2Dゲームプログラミング」
iPhoneゲームアプリを簡単に開発したいなら「Sprite Kit iPhone 2Dゲームプ