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.

10

Share

Download to read offline

プロトコル拡張の話? #WWDC21cafe

Download to read offline

2015 年の七夕の日に開催された @yucovin さん主催の「WWDC2015 情報共有会」で、Swift 2.0 で登場したプロトコル拡張 (Protocol Extension) の基本的な書き方を中心に、簡単にながらその魅力を紹介してきました。

プロトコル拡張って、機能だけ見るとそんな難しいものではなくて、それより使いどころを意識する方が大事なのかも? そう思って、新機能ではないですけれど、それを支えるそもそもの「プロトコル」というものについての特徴をさらっと整理してみて、そこのどこに今回のプロトコル拡張が食い込んできたのか、そんなところを雰囲気程度ですけれど、感じられるようにしてみました。

プロトコル拡張に関心を持つきっかけにしてもらえたら幸いです。

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

プロトコル拡張の話? #WWDC21cafe

  1. 1. EZ-‐‑‒NET  熊⾕谷友宏   http://ez-‐‑‒net.jp/ Swift 2.0 2015.07.07   @  WWDC2015  情報共有会 プロトコル拡張の話?
  2. 2. 熊谷友宏 EZ-NET http://ez-net.jp/ @es_kumagai Xcode 5 徹底解説 IP Phone 音でダイヤル 音で再配達ゴッド いつもの電卓 with 割勘ウォッチ MOSA
  3. 3. #yidev 横浜 iPhone 開発者勉強会 熊谷友宏 EZ-NET http://ez-net.jp/ @es_kumagai 次回は 7月11日に開催 https://atnd.org/events/67499
  4. 4. プロトコル拡張とは?
  5. 5. プロトコルを拡張する機能 Swift 2.0 で新登場
  6. 6. たとえば
  7. 7. こんなプロトコルがあったとき protocol CollectionType : SequenceType { typealias Generator : GeneratorType typealias Index : ForwardIndexType subscript(index:Index) -> Generator.Element { get } var startIndex:Index { get } var endIndex:Index { get } } protocol GeneratorType { typealias Element }
  8. 8. プロトコル拡張の基本
  9. 9. extension CollectionType { var count:Index.Distance { return distance( self.startIndex, self.endIndex) } } 既定の実装を追加
  10. 10. let array = [Int]() let dictionary = [String:Int]() array.count dictionary.count 既定の実装を追加 全てのコレクション型で使える
  11. 11. extension CollectionType where Generator.Element : IntegerType { var sum:Generator.Element { return self.reduce(0) { $0 + $1 } } } 条件を限定して実装を追加
  12. 12. let intArray = [Int]() let strArray = [String]() intArray.sum strArray.sum 条件を限定して実装を追加 条件に合致した型だけで使える
  13. 13. 細かい条件指定
  14. 14. extension CollectionType where Index : Streamable, Generator.Element : IntegerType { func printIndexOf<S:OutputStreamType> (element:Generator.Element, inout to stream:S) { self.indexOf(element)?.writeTo(&stream) } } 複数の条件で限定
  15. 15. extension CollectionType where Generator.Element : IntegerType, Index.Distance == Generator.Element { var average:Generator.Element { return self.reduce(0) { $0 + $1 } / self.count } var count:Index.Distance { return distance( self.startIndex, self.endIndex) } } 型が同じという前提
  16. 16. extension CollectionType where Self : Equatable, Self : NillLiteralConvertible { var isNull:Bool { return self == nil } } 自分自身を限定する
  17. 17. extension CollectionType where Generator.Element == String { var lastPathComponents:String { return self.map { $0.lastPathComponent } } } 型で明示的に限定
  18. 18. 既定の実装
  19. 19. extension CollectionType { var isEmpty:Bool { return self.startIndex == self.endIndex } } struct MyCollection : CollectionType { var isEmpty:Bool { return reduce(true) { $0 && $1.isEmpty } } } 既定の実装は上書き可能
  20. 20. これくらい
  21. 21. 扱い方が大事かも?
  22. 22. プロトコルを拡張する機能 プロトコル拡張 〓
  23. 23. プロトコル 型の振る舞いを決めるもの
  24. 24. オブジェクト指向 これまでの話 ⽣生物 ⽣生きる機能を実装   消化器・循環器・呼吸器など 動物 動く機能を実装   運動神経・関節など ⾁肉⾷食 ⾷食事を⾁肉に限定   必要な機能を実装 ⽝犬⽝犬 ワンと吠える、雑⾷食性など   ⽝犬らしい機能の実装 柴⽝犬 かわいく!_̲ 「ふぉとさいく」より   http://410319.jp/sozai/ 機能を特化して積み上げる クラス継承
  25. 25. オブジェクト指向 これまでの話 ⼩小太郎郎柴⽝犬 2014  年年柴⽝犬名前ランキング  1  位   http://⽝犬の性格と選び⽅方.com/namerank-‐‑‒3110 飼い主が犬を操縦する 手続き型っぽい? お⼿手! おすわり! 待て! 吠えろ くるっと回らせよう ご飯を与えて噛ませる
  26. 26. プロトコル指向 これからの話? 柴⽝犬 型には最低限の機能   だけを揃える ⾁肉⾷食型 ⾛走れる 歩ける 雑⾷食性 型を特徴で説明する プロトコルで特徴を表現 吠え れる ⽝犬型
  27. 27. プロトコル指向 これからの話? 柴⽝犬 ⾁肉⾷食型 ⾛走れる 歩ける 吠え れる 雑⾷食性 吠えさせる ⾛走らせる ⽌止まらせる⾁肉を与える 特徴に応じた機能を える ジェネリック関数 型には最低限の機能   だけを揃える ⽝犬型
  28. 28. プロトコル指向 これからの話? 吠えさせる ⾛走らせる ⽌止まらせる⾁肉を与える 特徴から機能を選ぶ 関数型っぽい? ⼩小太郎郎柴⽝犬 ⾁肉⾷食型 ⾛走れる 吠え れる 雑⾷食性 なにを
 させよう?
  29. 29. 柴⽝犬 吠え れる ⽝犬型 プロトコル指向 さらにこれから ⾁肉⾷食型 ⾛走れる 歩ける 雑⾷食性 型には最低限の機能   だけを揃える 吠えさせる ⾛走らせる ⽌止まらせる⾁肉を与える
  30. 30. 柴⽝犬 吠え れる ⽝犬型 プロトコル指向 さらにこれから ⾁肉⾷食型 ⾛走れる 歩ける 雑⾷食性 特徴に機能を関連付ける プロトコル拡張 吠えさせる ⾛走らせる ⽌止まらせる ⾁肉を与える 型には最低限の機能   だけを揃える
  31. 31. 柴⽝犬 ⽝犬型 プロトコル指向 さらにこれから 吠え れる⾁肉⾷食型 ⾛走れる 歩ける 雑⾷食性 さらに歩けて吠えれるなら…
  32. 32. 柴⽝犬 ⽝犬型 プロトコル指向 さらにこれから 特徴に着目して機能を作る 条件付きプロトコル拡張 『三回まわってワン!』 さらに歩けて吠えれるなら… 右回りで歩かせて… 右回りで歩かせて… 右回りで歩かせて… 吠えさせる 〓 かわいさ作りに_̲
 専念念できる_̲_̲
  33. 33. こんなところが プロトコルの醍醐味かも
  34. 34. プロトコル拡張の話? おしまい ▶ プロトコル拡張 ✴ プロトコルを拡張する機能 ✴ 既定の実装を添えられる ✴ 条件で縛った実装が可能 ✴ プロトコルでも型でも縛れる ✴ 既定の実装は上書きできる ▶ プロトコルの醍醐味 ✴ 特徴を寄せ集めて型を作る ✴ 特徴に着目したプログラミング
  • horaishotaro

    Feb. 15, 2017
  • fumiyasakai37

    Apr. 24, 2016
  • KosukeNakamura

    Mar. 17, 2016
  • fujipara

    Sep. 29, 2015
  • ksc1213

    Sep. 27, 2015
  • minihouse55

    Sep. 11, 2015
  • questbeat

    Jul. 19, 2015
  • kyamane13

    Jul. 19, 2015
  • SusumuHoshikawa

    Jul. 15, 2015
  • jstarfruits

    Jul. 10, 2015

2015 年の七夕の日に開催された @yucovin さん主催の「WWDC2015 情報共有会」で、Swift 2.0 で登場したプロトコル拡張 (Protocol Extension) の基本的な書き方を中心に、簡単にながらその魅力を紹介してきました。 プロトコル拡張って、機能だけ見るとそんな難しいものではなくて、それより使いどころを意識する方が大事なのかも? そう思って、新機能ではないですけれど、それを支えるそもそもの「プロトコル」というものについての特徴をさらっと整理してみて、そこのどこに今回のプロトコル拡張が食い込んできたのか、そんなところを雰囲気程度ですけれど、感じられるようにしてみました。 プロトコル拡張に関心を持つきっかけにしてもらえたら幸いです。

Views

Total views

6,395

On Slideshare

0

From embeds

0

Number of embeds

2,701

Actions

Downloads

16

Shares

0

Comments

0

Likes

10

×