Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Swift勉強会。はてなとかclosuresについて

7,153 views

Published on

福岡Swift&Obj-C&Xcode勉強会-0x02で発表したスライド

Published in: Technology
  • Be the first to comment

Swift勉強会。はてなとかclosuresについて

  1. 1. (?)とかClosuresについて By nobkz
  2. 2. 僕のこと Technical Rockstars CTO twitterよくやってます: @nobkz
  3. 3. アジェンダー (?)ハテナ closuresについて
  4. 4. (?)ハテナ
  5. 5. WWDC 2014にて
  6. 6. みじかくかけるね! けど ? ってなんだ?
  7. 7. 絶望的なググラビティ 「?」検索し辛いよね!
  8. 8. 一言で言いますと….
  9. 9. ?は「何も無い値」を 上手に扱う記法なんだ!
  10. 10. 何も無い値?
  11. 11. nilについて nilやnullなどの何も無い型はtype-safeで無かった 例外でエラー出したり… null, nilチェックが面倒だったり….
  12. 12. そこで! Optionalですよ!
  13. 13. Optional HaskellではMaybeに近いかもね…. ScalaではOptionに近いかもね… あるか無いかを表わす型 -> nilが入る型
  14. 14. 通常の型 let x : Int = 1 let y : Int = 2 let z : Int = nil // コンパイルエ ラー! Swiftでは、通常の型にnilを代入しようとすると コンパイルエラーになる
  15. 15. Optional型 Swiftでは、Optional<T>の型に代入すると、 型のエラーがでなくなる let x : Optional<Int> = 1 let y : Optional<Int> = 2 let z : Optional<Int> = nil
  16. 16. Optional型 これはコンパイルエラーになる!!! Optional<T>型からT型に代入はできない!! let x : Optional<Int> = 1 let y :
  17. 17. シンタックスシュガー的なも のとして ?は型を記述する時においては、 Optional<T>のシンタックスシュガー的なもの (挙動が微妙に違うらしい) ! Optional<T> ≒ T? let x : Int?= 1 let y : Int?= 2 let z : Int?= nil
  18. 18. つまり
  19. 19. Optional<T>は、nullとTを セットにして、wrapした型と言える
  20. 20. Tをwrapした型なら、 当然、unwrapしないと、Tは使えない
  21. 21. そこで、swiftは、 unwrapするための型を提供している
  22. 22. ImplicitlyUnwrappedOptional Optionalはnilを含む型 逆に、Unwrapした型をありえるよね? 暗黙的にアンラップしたOptional型
  23. 23. ImplicitlyUnwrappedOptional<T> 最後にOptionalとあるように、 Optional<T>型から、ImplicityUnwrappedOptional<T> に代入することができる let x : Int? = 1 let z : Int? = nil ! let a : ImplicitlyUnwrappedOptional<Int> = x let b : ImplicitlyUnwrappedOptional<Int> = z
  24. 24. ImplicitlyUnwrappedOptional<T> Unwrapした型なので そのまま、Unwrapした値に 型チェックが通る let x : Optional<Int> = 1 let a : ImplicitlyUnwrappedOptional<Int> = x let b : Int = a
  25. 25. ImplicitlyUnwrappedOptional<T> nilを代入したりすると、 コンパイルは通るけれども 実行時エラーとなる let x : Optional<Int> = nil let a : ImplicitlyUnwrappedOptional<Int> = x let b : Int = a
  26. 26. つまり….
  27. 27. ImplicityUnwrapOptional<T> コードの文脈から、これは絶対にTに unwrapできると言うための Optionalの型
  28. 28. ビックリマーク ?は型を記述する時においては、 Imp(略)のシンタックスシュガー ! ! let x : Int? = 1 let z : Int? = nil ! let a : Int! = x let b : Int!= z
  29. 29. Unwrapめんどい Optional型はラップされている なので普段はUnwrapしてから…. めんどい!
  30. 30. 人がいました class Person{ var name : String init(name:String){ self.name = name } func showName(){ println(self.name) } }
  31. 31. 部屋がありました class Room { var resident : Person? init(resident:Person?){ self.resident = resident } }
  32. 32. 人がいたら、名前を聞く let room1 = Room(resident:Person(name:"Nobkz")) ! let optionResident : Person? = room1.resident if( optionResident != nil ){ let resident : Person! = optionResident resident.showName() }
  33. 33. Optional Chain Optionalな値を取り出すとき楽になる記法 room1.resident?.showName() let optionResident : Person? = room1.resident if( optionResident != nil ){ let resident : Person! = optionResident resident.showName() }
  34. 34. もうひとつ var room2 = Room(resident:Person(name:"Nobkz")) var resident2 : Person! = room2.resident resident2.name = "Kuroneko" var room2 = Room(resident:Person(name:"Nobkz")) room2.resident.name = “Kuroneko" //コンパイルエラー residentはOptional<Person>なので、 これだとエラー これだとOk!
  35. 35. Option Chain var resident2 : Person! = room2.resident resident2.name = "Kuroneko" room2.resident!.name = “Kuroneko”
  36. 36. まとめ Optionalは何も無い型を表わす !,?は便利
  37. 37. Closuresについて
  38. 38. 関数 func f(x:Int)->Int { return x } func 関数名(引数:型名) -> 戻り値型{ ... .... return ... } こんなかんじ 例
  39. 39. Closures 関数値を気軽に書けるんだな つまり、無名関数を実現するなんだな さらに、シンタックスシュガーがあるんだな
  40. 40. Closures func f(x:Int)->Int { return x } let f = { (x:Int) -> Int in return x } シンタックスシュガー
  41. 41. ソート sort([2,3,5,6,1], { (x:Int, y:Int) -> Bool in return x < y }) func dest(x:Int, y:Int) -> Bool { return x < y } ! sort([2,3,5,6,1],dest)
  42. 42. よりみじかく sort([2,3,5,6,1], { (x,y) in return x < y }) sort([2,3,5,6,1],{ (x,y) in x < y }) sort([2,3,5,6,1],{ $0 < $1 })
  43. 43. え? let dest = { $0 < $1 } // エラー
  44. 44. 変数に型を定義する 関数リテラル自身は、 型推論してくれないみたい…? let dest : (Int,Int) -> Bool = { $0 < $1 }
  45. 45. パラメトリック多相関数につ いて func id(x:Int) -> Int { return x } ! func id(x:String) -> String { return x } ! func id(x:Double) -> Double{ return x } id(10) id("aaa") id(1.1)
  46. 46. ジェネリック関数 func id<T>(x:T) -> T { return x } id(10) id("aaa") id(1.1)
  47. 47. 無名の多相はむりだった let id = { <T>(x:T) -> T in return x } // がダメ… let id<T> = { (x:T) -> T in return x } // がダメ… let id = <T>{ (x:T) -> T in return x } // がダメ… 残念
  48. 48. まとめ Closuresは無名関数 + シンタックスシュガー 型推論に難あり ジェネリック無名関数は無理ぽ
  49. 49. まだまだ、いろいろ機能(enumとか、subscriptとか)があるけど、 ここまで!
  50. 50. 時間が無いのでまた次の機会で!
  51. 51. おわり

×