Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

84 visualizaciones

Publicado el

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

Publicado en: Software
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

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

×