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.

Pattern match with case class

3.072 visualizaciones

Publicado el

  • Sé el primero en comentar

Pattern match with case class

  1. 1. Pattern match with case class 佐々木 海(Sasaki Kai) 第2回Swift勉強会 @TechBuzzSpace
  2. 2. Who am I? 佐々木 海(Sasaki Kai) @Lewuathe プラットフォームエンジニア emailとか、Push通知とか C/C++, nodejs, Python iOSアプリは普段作ってません
  3. 3. Topic ケースクラスを使ったパターンマッチを Swiftで実装してみた話
  4. 4. What is case class? Scalaに組み込みの仕組み ! ! クラス名の前にcaseキーワード abstract class Expr case class Var(name: String) extends Expr case class Number(num: Double) extends Expr
  5. 5. Why case class? ファクトリメソッドの生成
  6. 6. Why case class? ファクトリメソッドの生成 constant memberの生成
  7. 7. Why case class? ファクトリメソッドの生成 constant memberの生成 toString,equalsとかの実装
  8. 8. Why case class? ファクトリメソッドの生成 constant memberの生成 toString,equalsとかの実装 コンストラクタパターン
  9. 9. What is constructor pattern? case class User(name: String, age: Int){} ! ! !
  10. 10. What is constructor pattern? case class User(name: String, age: Int){} ! val you = User(“Nobita”, 12) ! ! !
  11. 11. What is constructor pattern? case class User(name: String, age: Int){} ! val you = User(“Nobita”, 12) ! you match { case User(“Takeshi”, 13) => “He is Takeshi” case User(“Nobita”, 12) => “He is Nobita” case _ => “Who is he?” } !
  12. 12. What is constructor pattern? 要するに ! コンストラクタに渡された引数リストで パターンマッチを行う仕組み
  13. 13. BTW, Swift? Swiftではパターンマッチが使える switch文 loop 変数binding tuple, identifier
  14. 14. BTW, Swift? でもコンストラクタパターンは使えない
  15. 15. SwiftCase コンストラクタパターンによるマッ チングをするためのライブラリ https://github.com/Lewuathe/SwiftCase
  16. 16. How to use class User: SwiftCase { let name: String let age: Int ! init(name: String, age: Int) { self.name = name self.age = age super.init(name, age) } } !
  17. 17. How to use class User: SwiftCase { let name: String let age: Int ! init(name: String, age: Int) { self.name = name self.age = age super.init(name, age) } } ! SwiftCaseを 継承させる
  18. 18. How to use class User: SwiftCase { let name: String let age: Int ! init(name: String, age: Int) { self.name = name self.age = age super.init(name, age) } } ! SwiftCaseを 継承させる superクラスの initializerに パラメタリストを渡す
  19. 19. How to use let user = User(name: “Nobita”, 12) ! switch user { case User(name: “Takeshi”, age: 13): println(“He is Takeshi”) case User(name: “Nobita”, age: 12): println(“He is Nobita”) case default: println(“Who is he?”) } ! // -> He is Nobita !
  20. 20. How to use let user = User(name: “Nobita”, 12) ! switch user { case User(name: “Takeshi”, age: 13): println(“He is Takeshi”) case User(name: “Nobita”, age: 12): println(“He is Nobita”) case default: println(“Who is he?”) } ! // -> He is Nobita 直書き
  21. 21. Recursive match class UserPair: SwiftCase { let first: User let second: User ! init(first: User, second: User) { self.first = first self.second = second super.init(first, second) } } ! メンバにUser型
  22. 22. Recursive match class UserPair: SwiftCase { let first: User let second: User ! init(first: User, second: User) { self.first = first self.second = second super.init(first, second) } } ! メンバにUser型 superクラスの initializerに パラメタリストを渡す
  23. 23. Recursive match let nobi = User(name: “Nobita”, 12) let take = User(name: “Takeshi”, 13) ! ! let userPair = UserPair(first: nobi, second: take) ! !
  24. 24. Recursive match switch userPair { case User(“Takeshi”, 13): println(“He is Takeshi”) case UserPair(User(name: “Nobita”, age: 100), User(name: “Takeshi”, age: 99)): println(“They are too old”) case UserPair(User(name: “Nobita”, age: 12), User(name: “Takeshi”, age: 13)): println(“Yes, that’s right”) case default: println(“Who are they?”) } !
  25. 25. Recursive match switch userPair { case User(“Takeshi”, 13): println(“He is Takeshi”) case UserPair(User(name: “Nobita”, age: 100), User(name: “Takeshi”, age: 99)): println(“They are too old”) case UserPair(User(name: “Nobita”, age: 12), User(name: “Takeshi”, age: 13)): println(“Yes, that’s right”) case default: println(“Who are they?”) } !
  26. 26. Recursive match switch userPair { case User(“Takeshi”, 13): println(“He is Takeshi”) case UserPair(User(name: “Nobita”, age: 100), User(name: “Takeshi”, age: 99)): println(“They are too old”) case UserPair(User(name: “Nobita”, age: 12), User(name: “Takeshi”, age: 13)): println(“Yes, that’s right”) case default: println(“Who are they?”) } ! メンバのメンバ とmatch
  27. 27. Why SwiftCase? コンストラクタパターンによるマッチング SwiftCase同士での再帰的なマッチング
  28. 28. Tips Expression pattern Type casting pattern Equitable Protocol Variadic Parameters
  29. 29. Expression Pattern switch文のパターンマッチで呼ばれる func ~= (c1: SwiftCase, c2: SwiftCase)-> Bool { return internalMathcing(c1, c2) }
  30. 30. Typecasting Pattern ある型としてその変数が利用できる かを判定できる let m = matchArr[i] as? SwiftCase optional typeとしてcast した結果を返してくれる
  31. 31. Equitable Protocol == 演算子を定義している 今回matchingに==を使っている
  32. 32. Equitable Protocol == 演算子を定義している 今回matchingに==を使っている NSObjectのサブクラスに対して
  33. 33. Equitable Protocol == 演算子を定義している 今回matchingに==を使っている NSObjectのサブクラスに対して AnyはEquitableでない
  34. 34. Variadic Parameters 可変長引数 init(_ params: NSObject...) { // Do something } NSObjectのコレクション型
  35. 35. Variadic Parameters 可変長引数 init(_ params: NSObject...) { // Do something } NSObjectのコレクション型 名前付きパラメタを 要求しない
  36. 36. In Conclusion コンストラクタパターンは便利 Advanced Swiftの内容がよくわかった できれば変数束縛も実装したい(たぶんできない)
  37. 37. Reference The Swift programming language https://developer.apple.com/library/prerelease/ ios/documentation/Swift/Conceptual/ Swift_Programming_Language/index.html#// apple_ref/doc/uid/TP40014097 Advanced Swift https://developer.apple.com/videos/wwdc/2014/? id=404
  38. 38. Thank you

×