SlideShare a Scribd company logo
Enumはデキる子
AKIBA.swift #02
case .Success(let value):
Takaaki Tanaka
About Me
• 田中 孝明 (Takaaki Tanaka)
• クラスメソッド株式会社
• @kongmingtrap
• iOS Developer (Swift / Objective-C)
• GyazSquare / GitHub
Agenda
• Enumについて
• Enumについて
• Enumについて
Enum
• プログラム上、意味のある値を列挙して定義するこ
とができる
• Objective-C → Swiftで大幅に強化された
• むしろほぼ別物と言っても過言ではない
Enum
enum {
IMTypeCute,
IMTypeCool,
IMTypePassion
};
• C/C++ Style 😨
Enum
typedef NS_ENUM(NSUInteger, IMType) {
IMTypeCute,
IMTypeCool,
IMTypePassion
};
• Objective-C (Cocoa) Style 😨
Enum
typedef NS_OPTIONS(NSUInteger, IMType) {
IMTypeCute = 1UL << 0,
IMTypeCool = 1UL << 1,
IMTypePassion = 1UL << 2,
IMTypeAll = (IMTypeCute | IMTypeCool | IMTypePassion)
};
• Objective-C (Cocoa) Style 😨
SwiftでのEnumの特徴
• 第一級オブジェクト(first-class type)
• RawValue(String / Int / Float)
• ネスト定義ができる
• 独自のメソッドを定義できる
• Caseにtupleが使える
第一級オブジェクト
(first-class type)
• 変数に格納可能
• データ構造に格納可能
• それ自体が独自に存在できる
• 関数のパラメータとして渡すことができる
• 関数の戻り値として返すことができる
RawValue
enum PeachBoySlave: Int {
case Dog
case Monkey
case Bird
}
• Swift Style 😋
print(PeachBoySlave.Bird.rawValue) // 2
RawValue
enum PeachBoySlave: String {
case Dog = "Dog"
case Monkey = "Monkey"
case Bird = "Bird"
}
• Swift Style 😋
print(PeachBoySlave.Bird.rawValue) // Bird
RawValue
guard let slaveType = PeachBoySlave(rawValue: "Bird") else {
return
}
• RawValueに存在すればEnumを実体化できる
print(slaveType) // Bird
ネスト
enum PeachBoySlave: String {
case Dog
case Monkey
case Bird
enum Actor {
case Grandpa
case Grandma
}
}
• Enumの定義内にさらにEnumを定義することが可
能
独自のメソッド定義
enum PeachBoyEnemy {
case Oni
case Boss
func encount() {
print("Enemy")
}
}
• Enumにも関数を定義することができる
計算型プロパティ定義
enum PeachBoyEnemy {
case Oni
case Boss
…
var count: Int {
switch self {
case Oni:
return 10
case Boss:
return 1
}
}
}
• 計算型プロパティのみ定義することができる
Tuple
enum PeachBoyEnemy {
case Oni(String, String)
case Boss
func encount() {
switch self {
case Oni(let number, let colorName):
print(Number + ": Oni " + colorName)
case Boss:
print("Boss")
}
}
}
• CaseにTupleを指定することで異なる構造を持つ
メンバーを定義することができる
Tuple
let oni: PeachBoyEnemy = .Oni("1", "Red")
oni.encount()
• CaseにTupleを指定することで異なる構造を持つ
メンバーを定義することができる
1: Oni Red
AlamofireのRouterでの応用
enum Router: URLRequestConvertible {
case ItemSearch([String : AnyObject])
var URLString: String {
let baseURL = "http://shopping.yahooapis.jp/ShoppingWebService/V1/json/"
switch self {
case ItemSearch:
return baseURL + "itemSearch"
}
}
var Method: Alamofire.Method {
switch self {
case .ItemSearch:
return .GET
}
}
var URLRequest: NSMutableURLRequest {
let request = NSMutableURLRequest(URL: NSURL(string: URLString)!)
switch self {
case .ItemSearch(let parameters):
return Alamofire.ParameterEncoding.URL.encode(request, parameters: parameters).0
}
}
AlamofireのRouterでの応用
enum Router: URLRequestConvertible {
case ItemSearch([String : AnyObject])
…
var URLRequest: NSMutableURLRequest {
let request = NSMutableURLRequest(
URL: NSURL(string: URLString)!)
switch self {
case .ItemSearch(let parameters):
return Alamofire.ParameterEncoding.
URL.encode(
request, parameters: parameters).0
}
}
ジェネリクスの応用
public enum Result<Value, Error: ErrorType> {
case Success(Value)
case Failure(Error)
}
• tubleとジェネリクスを指定することで成功時、失
敗時も値を返すEnumを定義することができる
ジェネリクスの応用
func resultWithCode(code: Int?) -> Result<Int, NSError> {
guard let unwrapedCode = code else {
return .Failure(NSError(domain: "MyApp", code: 0,
userInfo: nil))
}
return .Success(unwrapedCode)
}
• 戻り値をResultにした場合
ジェネリクスの応用
let result = resultWithCode(200)
switch result {
case .Success(let code):
print(code)
case .Failure(let error):
print(error)
}
• 値はパターンマッチで比較することができる
実際に使うケース
Alamofire.request(Router.ItemSearch(parameters))
.responseJSON { response in
switch response.result {
case .Success(let value) :
let json = JSON(value)
guard let resultSet = json["ResultSet"].dictionary else {
return
}
guard let resultsOfOnePage = resultSet["0"]?.dictionary else {
return
}
guard let results = resultsOfOnePage["Result"]?.dictionary else {
return
}
self.items = results.keys.map { Item(json: results[$0]!) }
case .Failure(let error) :
print("error: (error)")
}
self.tableView?.reloadData()
self.refreshControl?.endRefreshing()
}
実践編
Modern Core Data by try! Swift
まとめ
• Objective-Cからの強化されている
• 過去の遺産を型安全なプログラムへ生まれ変わらせ
るヒントになる
• ジェネリクスと応用すると値の比較処理も簡潔に記
述できる

More Related Content

PDF
実践Realm
PDF
15分でざっくり分かるScala入門
PDF
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
PDF
Python を使ってカメリオを高速化した話
PDF
Ansible入門...?
PDF
メタメタプログラミングRuby
実践Realm
15分でざっくり分かるScala入門
書籍「軽量・高速モバイルデータベース Realm入門」を使って学ぶRealmの勘所
awk v.s. bashどっちが強い?@OSC2011Tokyo
Python を使ってカメリオを高速化した話
Ansible入門...?
メタメタプログラミングRuby

What's hot (20)

PDF
GNU awk (gawk) を用いた Apache ログ解析方法
PDF
RailsエンジニアのためのSQLチューニング速習会
PDF
OSS についてあれこれ
KEY
Go言語のスライスを理解しよう
PDF
Boost Tour 1.50.0
PDF
Lisp Tutorial for Pythonista Day 6
PPTX
前期講座09
PDF
Active Support のコア拡張機能について
PDF
boost tour 1.48.0 all
PDF
テスト用ライブラリ power-assert
PDF
FP習熟度レベルとFSharpxのIteratee
PDF
Lisp Tutorial for Pythonista : Day 3
PDF
Haskell超初心者勉強会11
KEY
5分程度で分かる? Appceleratorの方のAlloy
KEY
第3回BDD勉強会
PDF
Subprocess no susume
PDF
オープンソースソフトウェア検索サーバ Solr入門
PDF
R入門(dplyrでデータ加工)-TokyoR42
PPT
Glibc malloc internal
PDF
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
GNU awk (gawk) を用いた Apache ログ解析方法
RailsエンジニアのためのSQLチューニング速習会
OSS についてあれこれ
Go言語のスライスを理解しよう
Boost Tour 1.50.0
Lisp Tutorial for Pythonista Day 6
前期講座09
Active Support のコア拡張機能について
boost tour 1.48.0 all
テスト用ライブラリ power-assert
FP習熟度レベルとFSharpxのIteratee
Lisp Tutorial for Pythonista : Day 3
Haskell超初心者勉強会11
5分程度で分かる? Appceleratorの方のAlloy
第3回BDD勉強会
Subprocess no susume
オープンソースソフトウェア検索サーバ Solr入門
R入門(dplyrでデータ加工)-TokyoR42
Glibc malloc internal
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
Ad

Similar to Enumはデキる子 ~ case .Success(let value): ~ (20)

PPTX
SQLマッピングフレームワーク「Kobati」のはなし
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
⑲jQueryをおぼえよう!その5
PDF
続・ゲンバのSwift
PDF
Unity2015_No10_~UGUI&Audio~
PPTX
JavaScriptクイックスタート
PPT
Scala on Hadoop
PPTX
Php in ruby
PDF
OSSから学ぶSwift実践テクニック
PDF
Favtile ~never write JS again~
PDF
実"戦"CakePHP Plugin
PDF
「Html sql」で図書館hpにアクセスしてみよう
PDF
Haikara
PPTX
T69 c++cli ネイティブライブラリラッピング入門
PPTX
秀スクリプトの話
PPT
CPANの依存モジュールをもう少し正しく検出したい
PDF
Phantom Type in Scala
PDF
⑯jQueryをおぼえよう!その2
PDF
スマートフォン向けサービスにおけるサーバサイド設計入門
PPTX
PHP, JavaScriptプログラマのためのC#入門
SQLマッピングフレームワーク「Kobati」のはなし
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
⑲jQueryをおぼえよう!その5
続・ゲンバのSwift
Unity2015_No10_~UGUI&Audio~
JavaScriptクイックスタート
Scala on Hadoop
Php in ruby
OSSから学ぶSwift実践テクニック
Favtile ~never write JS again~
実"戦"CakePHP Plugin
「Html sql」で図書館hpにアクセスしてみよう
Haikara
T69 c++cli ネイティブライブラリラッピング入門
秀スクリプトの話
CPANの依存モジュールをもう少し正しく検出したい
Phantom Type in Scala
⑯jQueryをおぼえよう!その2
スマートフォン向けサービスにおけるサーバサイド設計入門
PHP, JavaScriptプログラマのためのC#入門
Ad

More from Takaaki Tanaka (7)

PDF
Server Side? Swift
PDF
Swiftをキめると 気持ちいい!
PDF
AndroidーiOS開発比較〜iOSエンジニアから見たAndroidのアレコレ〜
PDF
全部見せます!最前線エンジニアが語るBleアプリケーションのハマりどころ(i os)
PDF
Swift api design guidelines (dec 3, 2015)
PDF
モバイル開発者から見た サーバーレスアーキテクチャ
PDF
AddressBook to Contacts
Server Side? Swift
Swiftをキめると 気持ちいい!
AndroidーiOS開発比較〜iOSエンジニアから見たAndroidのアレコレ〜
全部見せます!最前線エンジニアが語るBleアプリケーションのハマりどころ(i os)
Swift api design guidelines (dec 3, 2015)
モバイル開発者から見た サーバーレスアーキテクチャ
AddressBook to Contacts

Enumはデキる子 ~ case .Success(let value): ~