Swift の3大プロトコルを眺めてみる #love_swift

623 views
390 views

Published on

2016/04/24 の Swift 愛好会で発表した『Swift 標準プロトコルを旅して Swift と楽しく会話してみよう!』という趣旨のお話です。

Published in: Engineering
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
623
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Swift の3大プロトコルを眺めてみる #love_swift

  1. 1. EZ-NET 熊⾕友宏 http://ez-net.jp/ 2016.04.24 集まれ Swift 好き!Swift 愛好会 #6 主要3プロトコルを眺めてみる Swift カジュアルプログラミング Swift 2.2
  2. 2. 熊⾕友宏 Xcode 5 徹底解説 MOSA Xcode 5 の全機能を
 徹底的に解説した本 OSX/iOS 系の歴史深い
 有料会員制の勉強会 紙版は絶版、電⼦書籍は販売中 2016-05-13 初⼼者向けセミナーで登壇 Xcode 7 でも役⽴つはず 法人会員も多数 @es_kumagai EZ-NET http://ez-net.jp/ 書籍 / 登壇
  3. 3. 横浜 iPhone 開発者勉強会 #yidev わいわい・ゆるく、iPhone 開発者の
 みんなで楽しく過ごすのが⽬的の会 【 横浜・⾺⾞道 】 カジュアル Swift 勉強会 #cswift ゆるくみんなで Swift を語らえる場を
 作りたくて始めた会 【 横浜・⻘葉台 】 第23回を 2016-05-07 に開催予定 勉強会 熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/
  4. 4. CodePiece iOS, OS X, Apple Watch アプリ ソースコードを Twitter と Gist に同時投稿できる。 いつもの電卓 計算式も⾒える電卓アプリ。 watchOS 1 対応 ⾳で再配達ゴッド 簡単操作で 再配達の申し込み。 EZ-NET IP Phone iPhone でひかり電話を使う。 ⾃宅 LAN からの利⽤専⽤ 熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/
  5. 5. CodePiece for OS X 勉強会を楽しむアプリ ソースコードを Twitter と Gist に同時投稿できる
 勉強会で知⾒をみんなと共有したい時とかに便利! できること #love_swift
  6. 6. 前回
  7. 7. プロトコル ▶ 存在の感じ⽅ ▶ 観察のしかた ▶ 読み進め⽅ 繪⾯さんが⾒せてくれたこと
  8. 8. プロトコルを知ると Swift の気持ちが⾒えてくる
  9. 9. Swift の声をもっと聴きたい
  10. 10. 今回
  11. 11. プロトコルを実際に巡って Swift の⼼に触れてみる
  12. 12. その前に…
  13. 13. プロトコル指向に想う世界観 どうやら誤解を招いた様⼦
  14. 14. プロトコル指向に想う世界観 おそらく誤解を招いた部分
  15. 15. プロトコル指向に想う世界観 明確に分離したいのは 世界観 ⼈間界 霊界 明確に分離 物質世界 型 精神世界 プロトコル ※ 世界の交わりの観点なら ⼈間 (インスタンス) ⾒える ⾒えない
  16. 16. 閑話休題
  17. 17. 標準ライブラリの旅 主要3プロトコル 編
  18. 18. 主要3プロトコル 気づかずに多⽤してるプロトコルたち ▶ CollectionType ▶ SequenceType ▶ GeneratorType
  19. 19. たとえば、配列
  20. 20. 配列ってこんな感じ Array<Element>
  21. 21. 配列って 他にどんな機能があるんだろう
  22. 22. 配列の定義をたどる Jump To Definition Shortcut ⌃ ⌘ J
  23. 23. 配列の定義 これまでの定義の⾒⽅ こんな機能を 持っている
  24. 24. 配列の定義 新しい定義の⾒⽅ こんな性質も 持ち合わせている
  25. 25. プロトコルが 型に性質を与える
  26. 26. CollectionType が 配列らしさの根底にある Array<Element>: CollectionType
  27. 27. 掘り下げてみよう
  28. 28. プロトコル観察(1) CollectionType
  29. 29. その前に 想像してみてください
  30. 30. 配列の特徴を想像 ▶ 複数の要素を内包する ▶ 添字を使って要素を取り出せる ▶ 部分配列を切り出せる
  31. 31. CollectionType の印象を想像 ▶ 直訳すると、集約型 ▶ 複数の要素を集めていそう
  32. 32. 想像が 理解の⼤事な助けになる
  33. 33. CollectionType を観察 想像を以って
  34. 34. CollectionType 観察 定義を辿る Shortcut ⌃ ⌘ J
  35. 35. CollectionType 観察 定義を眺める(とにかく気軽に🙂) プロトコルを 継承してる
  36. 36. CollectionType 観察 もう少し定義を眺める(とにかく気軽に🙂) なんだろう? ややこしそう 添字で参照 配列の切り出し 内容を扱う
  37. 37. CollectionType 観察 再び定義を眺める(とにかく気軽に🙂) ややこしそう 配列の切り出し 配列切り出しで 使っていた CollectionType と 似た性質である CollectionType を 知れば解りそう とりあえず 部分配列っぽい
  38. 38. CollectionType 観察 ここまでの理解で定義を⾒渡す 残るのは この3つだけ
  39. 39. CollectionType 観察 まだ判らないプロトコル ▶ Indexable ▶ SequenceType ▶ GeneratorType 索引付け可能? 連続型? ⽣成器型? これなら 解りそうかも
  40. 40. 標準ライブラリの旅 ここまでの まとめ
  41. 41. ▶ CollectionType
 ▶ SequenceType
 ▶ GeneratorType
 ▶ Indexable
 標準ライブラリの旅 ここまでの まとめ 観察中 … 未調査 未調査 増えた!
  42. 42. プロトコル観察(2) Indexable
  43. 43. Indexable の印象を想像 ▶ 直訳すると、索引付け可能 ▶ 索引で何かを扱えそう
  44. 44. Indexable 観察 定義を辿る Shortcut ⌃ ⌘ J
  45. 45. Indexable 観察 定義を眺める また新しい プロトコル 索引の範囲表現 これはなに…?
  46. 46. Indexable 観察 調べやすそうなところに注⽬ これはなに…? 全く⼿がかりを 読み取れない … そういう時は 想像で OK !
  47. 47. Indexable 観察 再び定義を眺める 残るのは この1つだけ とりあえず 索引型?
  48. 48. Indexable が だいたいわかった
  49. 49. Indexable まとめ ▶ 索引の範囲を取得できる ▶ 添字で索引を添えてアクセスできる
  50. 50. Indexable 世界観 索引の範囲を取得でき、 添字で要素を参照できる性質 なにか startIndex endIndex
  51. 51. 標準ライブラリの旅 ここまでの まとめ
  52. 52. 標準ライブラリの旅 ここまでの まとめ ▶ CollectionType
 ▶ SequenceType
 ▶ GeneratorType
 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 増えた! 観察中 … 未調査 未調査
  53. 53. プロトコル観察(3) ForwardIndexType
  54. 54. ForwardIndexType の印象を想像 ▶ 直訳すると、索引型 (IndexType) ▶ 前⽅に進んでいけそう
  55. 55. ForwardIndexType 観察 定義を辿る Shortcut ⌃ ⌘ J
  56. 56. ForwardIndexType 観察 定義を眺める 新登場だけど たぶん符号付き整数 内部⽤っぽいので 無視したいけど無理… 他の索引との
 距離を得る 前⽅へ
 指定した距離 進む
  57. 57. ForwardIndexType 観察 しかたないので 定義を眺める 察するに… “増加可能” な性質 後続 (successor) を 取得するもの 察するに… “⽐較可能” な性質 同⼀性を判定
  58. 58. ForwardIndexType が だいたいわかった
  59. 59. ForwardIndexType まとめ ▶ 前⽅へ進める索引型 ▶ 任意の距離を指定して進める ▶ 索引型は⽐較可能
  60. 60. ForwardIndexType 世界観 先へ先へと辿れる、 索引を表現する型の性質 索引 A 索引 B 索引 C 索引 D successor advancedBy distanceTo
  61. 61. 標準ライブラリの旅 ここまでの まとめ
  62. 62. 標準ライブラリの旅 ここまでの まとめ ▶ CollectionType
 ▶ SequenceType
 ▶ GeneratorType
 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質 観察中 … 未調査 未調査
  63. 63. プロトコル観察(4) SequenceType
  64. 64. SequenceType の印象を想像 ▶ 直訳すると、連続型 ▶ 連続した値を扱えそう
  65. 65. SequenceType 観察 定義を辿る Shortcut ⌃ ⌘ J
  66. 66. SequenceType 観察 ざっくり定義を眺める この辺が 性質を意味しそう この辺は 性質がもたらす能⼒
  67. 67. SequenceType 観察 読みたいとこにアタリをつける こちらに注⽬ ざっと⾒て だいたい OK !
  68. 68. SequenceType 観察 アタリをつけたところを読む 再び登場。 なんだろう? Generator を ⽣成する?
  69. 69. プロトコル観察(5) GeneratorType
  70. 70. GeneratorType の印象を想像 ▶ 直訳すると、⽣成器型 ▶ 何かを⽣成できそう
  71. 71. GeneratorType 観察 定義を辿る Shortcut ⌃ ⌘ J
  72. 72. GeneratorType 観察 定義を眺める 次の値を⽣み出す
  73. 73. GeneratorType が だいたいわかった
  74. 74. GeneratorType まとめ ▶ 次の要素を⽣み出せる ▶ ⽣み出せない可能性もある
  75. 75. GeneratorType 世界観 次へ次へと要素を ⽣み出していける型の性質 next 生成器 要素 要素 要素
  76. 76. 標準ライブラリの旅 ここまでの まとめ
  77. 77. 標準ライブラリの旅 ここまでの まとめ ▶ CollectionType
 ▶ SequenceType
 ▶ GeneratorType
 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質 観察中 … 観察中 …
  78. 78. プロトコル観察(6) SequenceType
  79. 79. SequenceType 観察 ここまでくると意味が汲める 次々と値を
 ⽣成できる型 連続した値を 取得できる
  80. 80. SequenceType が だいたいわかった
  81. 81. SequenceType まとめ ▶ 連続する要素を扱う型 ▶ 要素を次々に得る概念を持つ ▶ 要素の並び順までは語られてなさそう
  82. 82. 標準ライブラリの旅 ここまでの まとめ
  83. 83. 標準ライブラリの旅 ここまでの まとめ ▶ CollectionType
 ▶ SequenceType
 連続する複数の要素を扱う型の性質 ▶ GeneratorType
 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質 観察中 …
  84. 84. プロトコル観察(7) CollectionType
  85. 85. CollectionType 観察 改めて定義を⾒渡す 要素を連続的に取得でき、 索引でも扱える性質 この辺りは もう⼤丈夫 内包する要素を ひとつずつ取得
  86. 86. CollectionType が だいたいわかった
  87. 87. CollectionType まとめ ▶ 複数要素を集めて扱う型 ▶ 要素は連続的で、索引で取り扱える性質を持つ ▶ 要素を次々に得る概念を持つ
  88. 88. 標準ライブラリの旅 達成
  89. 89. 標準ライブラリの旅 達成 ▶ CollectionType
 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType
 連続する複数の要素を扱う型の性質 ▶ GeneratorType
 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質
  90. 90. プロトコルの性質を知って活かすと Swift がもっと楽しくなる!
  91. 91. Swift に声をかけてみよう Swift の気持ちになって接する
  92. 92. フォトアルバム
  93. 93. フォトアルバム ▶ ひとつのデータ構造で表現する ▶ 複数枚の写真を収録する ▶ アルバムには表題を設定できる ▶ アルバム内の写真を⾃由に⾒られる 要件
  94. 94. フォトアルバム 実装
  95. 95. ここで Swift の気持ちに寄り添う
  96. 96. フォトアルバムの性質 複数の写真を持ち、自由に眺められる
  97. 97. 標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType
 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType
 連続する複数の要素を扱う型の性質 ▶ GeneratorType
 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質
  98. 98. フォトアルバムに CollectionType を適⽤
  99. 99. プロトコルの適⽤⽅法 ▶ プロトコルが持つ性質を
 実現するための振る舞いを実装する
 ▶ 性質から⾃然と導かれる振る舞いは
 普通は実装しなくて良い
 勘所 ↑ その性質を持つことを約束するために必須 ↑ 性質に基づいて既に規定されてる 具体的には … プロトコルで規定されている概念のうち、 extension で実装されていないものを実装していく
  100. 100. CollectionType の適⽤⽅法 性質を実現するために必要な機能 ▶ var startIndex: Index { get }
 最初の要素が存在する位置を⽰す索引を取得 ▶ var endIndex: Index { get }
 最後の要素の次の位置を⽰す索引を取得 ▶ subscript (position: Index) ->Element { get }
 指定した位置にある要素を取得
  101. 101. フォトアルバム CollectionType を適⽤
  102. 102. こんな感じにすると …
  103. 103. フォトアルバム Swift と会話が弾む
  104. 104. 楽しい!
  105. 105. 乱数ジェネレーター
  106. 106. 乱数ジェネレーター ▶ UInt32 の乱数を⽣成する ▶ 次々と乱数を作り出せる 要件
  107. 107. ここで Swift の気持ちに寄り添う
  108. 108. 乱数ジェネレーターの性質 次々と乱数を生成できる型
  109. 109. 標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType
 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType
 連続する複数の要素を扱う型の性質 ▶ GeneratorType
 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType
 先へ先へと辿れる索引を表現する型の性質
  110. 110. 乱数ジェネレーターを GeneratorType に基づいて実装
  111. 111. GeneratorType の適⽤⽅法 性質を実現するために必要な機能 ▶ mutating func next() -> Element?
 次の要素を⽣成
  112. 112. 乱数ジェネレーター GeneratorType に基づいて実装
  113. 113. こんな感じにすると …
  114. 114. 乱数ジェネレーター Swift と会話が弾む
  115. 115. Swiftと仲良くなれた! かも?
  116. 116. Swift との会話を ぜひ楽しんでみてください
  117. 117. まとめ 主要3プロトコルを眺めてみる 1. 標準ライブラリの旅 ✓ CollectionType ✓ SequenceType ✓ GeneratorType ✓ Indexable ✓ ForwardIndexType 2. Swift に声をかけてみよう ✓ フォトアルバム ✓ 乱数ジェネレーター

×