SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
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からの強化されている
• 過去の遺産を型安全なプログラムへ生まれ変わらせ
るヒントになる
• ジェネリクスと応用すると値の比較処理も簡潔に記
述できる

Contenu connexe

Tendances

GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
OSS についてあれこれ
OSS についてあれこれOSS についてあれこれ
OSS についてあれこれTakuto Wada
 
Go言語のスライスを理解しよう
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しようYasutaka Kawamoto
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
テスト用ライブラリ power-assert
テスト用ライブラリ power-assertテスト用ライブラリ power-assert
テスト用ライブラリ power-assertTakuto Wada
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateepocketberserker
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
 
5分程度で分かる? Appceleratorの方のAlloy
5分程度で分かる? Appceleratorの方のAlloy5分程度で分かる? Appceleratorの方のAlloy
5分程度で分かる? Appceleratorの方のAlloyMasato Kitao
 
第3回BDD勉強会
第3回BDD勉強会第3回BDD勉強会
第3回BDD勉強会zakihaya
 
R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42R入門(dplyrでデータ加工)-TokyoR42
R入門(dplyrでデータ加工)-TokyoR42Atsushi Hayakawa
 
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftTomohiro Kumagai
 

Tendances (20)

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

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

SQLマッピングフレームワーク「Kobati」のはなし
SQLマッピングフレームワーク「Kobati」のはなしSQLマッピングフレームワーク「Kobati」のはなし
SQLマッピングフレームワーク「Kobati」のはなしKazuki Minamitani
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
続・ゲンバのSwift
続・ゲンバのSwift続・ゲンバのSwift
続・ゲンバのSwiftYuichi Adachi
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Php in ruby
Php in rubyPhp in ruby
Php in rubydo_aki
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
Favtile ~never write JS again~
Favtile ~never write JS again~Favtile ~never write JS again~
Favtile ~never write JS again~hanachin
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」Shin Ise
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門Hisashi HATAKEYAMA
 

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

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

Plus de Takaaki Tanaka

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

Plus de Takaaki Tanaka (7)

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

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