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,
IMTy...
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(P...
RawValue
guard let slaveType = PeachBoySlave(rawValue: "Bird") else {
return
}
• RawValueに存在すればEnumを実体化できる
print(slaveType...
ネスト
enum PeachBoySlave: String {
case Dog
case Monkey
case Bird
enum Actor {
case Grandpa
case Grandma
}
}
• Enumの定義内にさらにE...
独自のメソッド定義
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 ...
Tuple
enum PeachBoyEnemy {
case Oni(String, String)
case Boss
func encount() {
switch self {
case Oni(let number, let colo...
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...
AlamofireのRouterでの応用
enum Router: URLRequestConvertible {
case ItemSearch([String : AnyObject])
…
var URLRequest: NSMutable...
ジェネリクスの応用
public enum Result<Value, Error: ErrorType> {
case Success(Value)
case Failure(Error)
}
• tubleとジェネリクスを指定することで成功...
ジェネリクスの応用
func resultWithCode(code: Int?) -> Result<Int, NSError> {
guard let unwrapedCode = code else {
return .Failure(N...
ジェネリクスの応用
let result = resultWithCode(200)
switch result {
case .Success(let code):
print(code)
case .Failure(let error):
...
実際に使うケース
Alamofire.request(Router.ItemSearch(parameters))
.responseJSON { response in
switch response.result {
case .Succe...
実践編
Modern Core Data by try! Swift
まとめ
• Objective-Cからの強化されている
• 過去の遺産を型安全なプログラムへ生まれ変わらせ
るヒントになる
• ジェネリクスと応用すると値の比較処理も簡潔に記
述できる
Próxima SlideShare
Cargando en…5
×

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

63 visualizaciones

Publicado el

AKIBA.swift #02での発表資料です

Publicado en: Software
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
63
En SlideShare
0
De insertados
0
Número de insertados
3
Acciones
Compartido
0
Descargas
2
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

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

  1. 1. Enumはデキる子 AKIBA.swift #02 case .Success(let value): Takaaki Tanaka
  2. 2. About Me • 田中 孝明 (Takaaki Tanaka) • クラスメソッド株式会社 • @kongmingtrap • iOS Developer (Swift / Objective-C) • GyazSquare / GitHub
  3. 3. Agenda • Enumについて • Enumについて • Enumについて
  4. 4. Enum • プログラム上、意味のある値を列挙して定義するこ とができる • Objective-C → Swiftで大幅に強化された • むしろほぼ別物と言っても過言ではない
  5. 5. Enum enum { IMTypeCute, IMTypeCool, IMTypePassion }; • C/C++ Style 😨
  6. 6. Enum typedef NS_ENUM(NSUInteger, IMType) { IMTypeCute, IMTypeCool, IMTypePassion }; • Objective-C (Cocoa) Style 😨
  7. 7. Enum typedef NS_OPTIONS(NSUInteger, IMType) { IMTypeCute = 1UL << 0, IMTypeCool = 1UL << 1, IMTypePassion = 1UL << 2, IMTypeAll = (IMTypeCute | IMTypeCool | IMTypePassion) }; • Objective-C (Cocoa) Style 😨
  8. 8. SwiftでのEnumの特徴 • 第一級オブジェクト(first-class type) • RawValue(String / Int / Float) • ネスト定義ができる • 独自のメソッドを定義できる • Caseにtupleが使える
  9. 9. 第一級オブジェクト (first-class type) • 変数に格納可能 • データ構造に格納可能 • それ自体が独自に存在できる • 関数のパラメータとして渡すことができる • 関数の戻り値として返すことができる
  10. 10. RawValue enum PeachBoySlave: Int { case Dog case Monkey case Bird } • Swift Style 😋 print(PeachBoySlave.Bird.rawValue) // 2
  11. 11. RawValue enum PeachBoySlave: String { case Dog = "Dog" case Monkey = "Monkey" case Bird = "Bird" } • Swift Style 😋 print(PeachBoySlave.Bird.rawValue) // Bird
  12. 12. RawValue guard let slaveType = PeachBoySlave(rawValue: "Bird") else { return } • RawValueに存在すればEnumを実体化できる print(slaveType) // Bird
  13. 13. ネスト enum PeachBoySlave: String { case Dog case Monkey case Bird enum Actor { case Grandpa case Grandma } } • Enumの定義内にさらにEnumを定義することが可 能
  14. 14. 独自のメソッド定義 enum PeachBoyEnemy { case Oni case Boss func encount() { print("Enemy") } } • Enumにも関数を定義することができる
  15. 15. 計算型プロパティ定義 enum PeachBoyEnemy { case Oni case Boss … var count: Int { switch self { case Oni: return 10 case Boss: return 1 } } } • 計算型プロパティのみ定義することができる
  16. 16. 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を指定することで異なる構造を持つ メンバーを定義することができる
  17. 17. Tuple let oni: PeachBoyEnemy = .Oni("1", "Red") oni.encount() • CaseにTupleを指定することで異なる構造を持つ メンバーを定義することができる 1: Oni Red
  18. 18. 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 } }
  19. 19. 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 } }
  20. 20. ジェネリクスの応用 public enum Result<Value, Error: ErrorType> { case Success(Value) case Failure(Error) } • tubleとジェネリクスを指定することで成功時、失 敗時も値を返すEnumを定義することができる
  21. 21. ジェネリクスの応用 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にした場合
  22. 22. ジェネリクスの応用 let result = resultWithCode(200) switch result { case .Success(let code): print(code) case .Failure(let error): print(error) } • 値はパターンマッチで比較することができる
  23. 23. 実際に使うケース 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() }
  24. 24. 実践編 Modern Core Data by try! Swift
  25. 25. まとめ • Objective-Cからの強化されている • 過去の遺産を型安全なプログラムへ生まれ変わらせ るヒントになる • ジェネリクスと応用すると値の比較処理も簡潔に記 述できる

×