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 の3大プロトコルを眺めてみる #love_swift

5,618 views

Published on

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

Published in: Engineering
  • Be the first to comment

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

  1. 1. 熊⾕友宏 http://ez-net.jp/ 2016.04.24 … 集まれ Swift 好き!Swift 愛好会 #6 2017.03.21 … Swift 3.1 対応 主要3プロトコルを眺めてみる Swift カジュアルプログラミング Swift 3.1
  2. 2. 前回の Swift 愛好会 にて
  3. 3. プロトコル ▶ 存在の感じ⽅ ▶ 観察のしかた ▶ 読み進め⽅ 繪⾯さんが⾒せてくれたこと
  4. 4. プロトコルを知ると Swift の気持ちが⾒えてくる
  5. 5. Swift の声をもっと聴きたい
  6. 6. 今回
  7. 7. プロトコルを実際に巡って Swift の⼼に触れてみる
  8. 8. 標準ライブラリの旅 主要3プロトコル 編
  9. 9. 主要3プロトコル 気づかずに多⽤してるプロトコルたち ▶ Collection ▶ Sequence ▶ IteratorProtocol
  10. 10. たとえば、配列
  11. 11. 配列ってこんな感じ Array<Element>
  12. 12. 配列って 他にどんな機能があるんだろう
  13. 13. 配列の定義をたどる Jump To Definition Shortcut ⌃ ⌘ J
  14. 14. 配列の定義 これまでの定義の⾒⽅ こんな機能を 持っている
  15. 15. 配列の定義 新しい定義の⾒⽅ こんな性質も 持ち合わせている
  16. 16. プロトコルが 型に性質を与える
  17. 17. Collection が 配列らしさの根底にある Array<Element>: Collection
  18. 18. 掘り下げてみよう
  19. 19. プロトコル観察(1) Collection
  20. 20. その前に 想像してみてください
  21. 21. 配列の特徴を想像 ▶ 複数の要素を内包する ▶ 添字を使って要素を取り出せる ▶ 部分配列を切り出せる
  22. 22. Collection の印象を想像 ▶ 直訳すると、集約型 ▶ 複数の要素を集めていそう
  23. 23. 想像が 理解の⼤事な助けになる
  24. 24. Collection を観察 想像を以って
  25. 25. Collection 観察 定義を辿る Shortcut ⌃ ⌘ J
  26. 26. Collection 観察 定義を眺める(とにかく気軽に🙂) プロトコルを 継承してる
  27. 27. Collection 観察 もう少し定義を眺める(とにかく気軽に🙂) なんだろう? ややこしそう 内容を扱う 配列の切り出し 添字で参照
  28. 28. Collection 観察 再び定義を眺める(とにかく気軽に🙂) ややこしそう 配列の切り出し 配列切り出しで 使っていた Collection と 似た性質である Collection を 知れば解りそう とりあえず 部分配列っぽい
  29. 29. Collection 観察 ここまでの理解で定義を⾒渡す 残るのは この4つだけ
  30. 30. Collection 観察 まだ判らないプロトコル ▶ Indexable ▶ Sequence ▶ IteratorProtocol ▶ IndexableBase 索引付け可能? 連続型? ⽣成器型? これなら 解りそうかも 索引付け可能、の⼟台? これなら 解りそうかも
  31. 31. 標準ライブラリの旅 ここまでの まとめ
  32. 32. ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 ▶ Indexable, IndexableBase
 
 標準ライブラリの旅 ここまでの まとめ 観察中 … 未調査 未調査 増えた!
  33. 33. プロトコル観察(2) Indexable
  34. 34. Indexable の印象を想像 ▶ 直訳すると、索引付け可能 ▶ 索引で何かを扱えそう
  35. 35. Indexable 観察 定義を辿る Shortcut ⌃ ⌘ J
  36. 36. Indexable 観察 定義を眺める 
 また新しい プロトコル 索引を 距離で移動 さっきも⾒たけど まだ知らない 索引から 距離を算出
  37. 37. Indexable 観察 再び定義を眺める 
 また新しい プロトコル さっきも⾒たけど まだ知らない とりあえず 符号付き整数? とりあえず Indexable の基盤?
  38. 38. 標準ライブラリの旅 ここまでの まとめ
  39. 39. ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 ▶ Indexable, IndexableBase
 ▶ SignedInteger
 増えた! 観察中 … 標準ライブラリの旅 ここまでの まとめ 観察中 … 未調査 未調査
  40. 40. プロトコル観察(3) IndexableBase
  41. 41. IndexableBase の印象を想像 ▶ 索引付け可能にするための⼟台? ▶ Indexable の基盤になってそう
  42. 42. IndexableBase 観察 定義を辿る Shortcut ⌃ ⌘ J
  43. 43. IndexableBase 観察 定義を眺める また新しい プロトコル 索引の範囲表現 索引の範囲表現 これはなに…?
  44. 44. IndexableBase 観察 調べやすそうなところに注⽬ これはなに…? 全く⼿がかりを 読み取れない … そういう時は 想像で OK !
  45. 45. IndexableBase 観察 再び定義を眺める 残るのは この1つだけ とりあえず ⽐較可能?
  46. 46. Indexable, IndexableBase が だいたいわかった
  47. 47. IndexableBase まとめ ▶ 索引の範囲を取得できる ▶ 添字で索引を添えてアクセスできる
  48. 48. Indexable まとめ ▶ Indexable の性質を引き継ぐ ▶ それに加えて、距離の概念を持つ
  49. 49. Indexable 世界観 索引の範囲を取得でき、添字で要素を参照できる性質 索引には距離の概念があり、距離指定して移動可能 なにか startIndex endIndex
  50. 50. 標準ライブラリの旅 ここまでの まとめ
  51. 51. 標準ライブラリの旅 ここまでの まとめ ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 ▶ Comparable 観察中 … 未調査 未調査 増えた! 未調査
  52. 52. プロトコル観察(4) SignedInteger
  53. 53. SignedInteger の印象を想像 ▶ 直訳すると、符号付き整数 ▶ 普通に数として使えそう
  54. 54. SignedInteger 観察 定義を辿る Shortcut ⌃ ⌘ J
  55. 55. SignedInteger 観察 定義を眺める IntMax 型との 相互変換 名前的に 内部⽤…? 察しがつくので とりあえず OK 知らないプロトコル でもたぶん 整数
  56. 56. SignedInteger が だいたいわかった
  57. 57. SignedInteger まとめ ▶ 符号付き整数 ▶ 整数としての性質を持つ
  58. 58. 標準ライブラリの旅 ここまでの まとめ
  59. 59. 標準ライブラリの旅 ここまでの まとめ ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable 観察中 … 未調査 未調査 未調査
  60. 60. プロトコル観察(5) Comparable
  61. 61. Comparable の印象を想像 ▶ 直訳すると、⽐較可能 ▶ 2つの値を⽐較できそう
  62. 62. Comparable 観察 定義を辿る Shortcut ⌃ ⌘ J
  63. 63. Comparable 観察 定義を眺める 不等号で⽐較 Equatable の
 性質も持つ 等号で⽐較
  64. 64. Comparable が だいたいわかった
  65. 65. SignedInteger まとめ ▶ 値の⼤⼩を⽐較できる ▶ 値が同じか判定できる
  66. 66. Comparable 世界観 値を⽐較できる性質 値 値
  67. 67. 標準ライブラリの旅 ここまでの まとめ
  68. 68. 標準ライブラリの旅 ここまでの まとめ ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質 観察中 … 未調査 未調査
  69. 69. プロトコル観察(6) Sequence
  70. 70. Sequence の印象を想像 ▶ 直訳すると、連続型 ▶ 連続した値を扱えそう
  71. 71. Sequence 観察 定義を辿る Shortcut ⌃ ⌘ J
  72. 72. Sequence 観察 ざっくり定義を眺める この辺が 性質を意味しそう この辺は 性質がもたらす能⼒
  73. 73. SequenceType 観察 読みたいとこにアタリをつける こちらに注⽬ ざっと⾒て だいたい OK !
  74. 74. SequenceType 観察 アタリをつけたところを読む 再び登場。 なんだろう? Iterator を ⽣成する?
  75. 75. プロトコル観察(7) IteratorProtocol
  76. 76. IteratorProtocol の印象を想像 ▶ 直訳すると、反復器を表すプロトコル ▶ 繰り返し処理で使いそう
  77. 77. IteratorProtocol 観察 定義を辿る Shortcut ⌃ ⌘ J
  78. 78. IteratorProtocol 観察 定義を眺める 次の値を取得する
  79. 79. IteratorProtocol が だいたいわかった
  80. 80. IteratorProtocol まとめ ▶ 次の要素を取り出せる ▶ 取り出せない可能性もある
  81. 81. IteratorProtocol 世界観 次へ次へと要素を 取り出していける型の性質 next 反復器 要素 要素 要素
  82. 82. 標準ライブラリの旅 ここまでの まとめ
  83. 83. 標準ライブラリの旅 ここまでの まとめ ▶ Collection
 ▶ Sequence
 ▶ IteratorProtocol
 次へ次へと要素を取り出していける型の性質 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質 観察中 … 観察中 …
  84. 84. プロトコル観察(8) Sequence
  85. 85. Sequence 観察 ここまでくると意味が汲める 次々と値を
 取得できる型 次々と値を 取得できる反復器を作る
  86. 86. Sequence が だいたいわかった
  87. 87. Sequence まとめ ▶ 連続する要素を扱う型 ▶ 要素を次々に得る概念を持つ ▶ 要素の並び順までは語られてなさそう
  88. 88. Sequence 世界観 連続する複数の要素を扱う型の性質 反復器を通して要素を次々と取得できる makeIterator 反復器 要素 要素 要素 要素 要素 要素 要素
  89. 89. 標準ライブラリの旅 ここまでの まとめ
  90. 90. 標準ライブラリの旅 ここまでの まとめ ▶ Collection
 ▶ Sequence
 連続する複数の要素を扱う型の性質 ▶ IteratorProtocol
 次へ次へと要素を取り出していける型の性質 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質 観察中 …
  91. 91. プロトコル観察(9) Collection
  92. 92. Collection 観察 改めて定義を⾒渡す 要素を連続的に取得でき、 索引でも扱える性質 この辺りは もう⼤丈夫 内包する要素を ひとつずつ取得
  93. 93. Collection が だいたいわかった
  94. 94. Collection まとめ ▶ 複数要素を集めて扱う型 ▶ 要素は連続的で、索引で取り扱える性質を持つ ▶ 要素を次々に得る概念を持つ
  95. 95. Collection 世界観 連続する複数の要素を扱う型の性質 反復器や索引を通して要素を⾃由に取得できる 反復器 要素 要素 要素 要素 要素 要素 要素 要素 startIndex endIndex 要素 makeIterator
  96. 96. 標準ライブラリの旅 達成
  97. 97. 標準ライブラリの旅 達成 ▶ Collection
 連続する複数要素を持ち、索引で扱える型の性質 ▶ Sequence
 連続する複数の要素を扱う型の性質 ▶ IteratorProtocol
 次へ次へと要素を取り出していける型の性質 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質
  98. 98. プロトコルの性質を知って活かすと Swift がもっと楽しくなる!
  99. 99. Swift に声をかけてみよう Swift の気持ちになって接する
  100. 100. フォトアルバム
  101. 101. フォトアルバム ▶ ひとつのデータ構造で表現する ▶ 複数枚の写真を収録する ▶ アルバムには表題を設定できる ▶ アルバム内の写真を⾃由に⾒られる 要件
  102. 102. フォトアルバム 実装
  103. 103. ここで Swift の気持ちに寄り添う
  104. 104. フォトアルバムの性質 複数の写真を持ち、⾃由に眺められる
  105. 105. 標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ Collection
 連続する複数要素を持ち、索引で扱える型の性質 ▶ Sequence
 連続する複数の要素を扱う型の性質 ▶ IteratorProtocol
 次へ次へと要素を取り出していける型の性質 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質
  106. 106. フォトアルバムに Collection を適⽤
  107. 107. プロトコルの適⽤⽅法 ▶ プロトコルが持つ性質を
 実現するための振る舞いを実装する
 ▶ 性質から⾃然と導かれる振る舞いは
 普通は実装しなくて良い
 勘所 ↑ その性質を持つことを約束するために必須 ↑ 性質に基づいて既に規定されてる 具体的には … プロトコルで規定されている概念のうち、 extension で実装されていないものを実装していく
  108. 108. CollectionType の適⽤⽅法 性質を実現するために必要な機能 ▶ var startIndex: Index { get }
 最初の要素が存在する位置を⽰す索引を取得 ▶ var endIndex: Index { get }
 最後の要素の次の位置を⽰す索引を取得 ▶ subscript (position: Index) -> Element
 指定した位置にある要素を取得 ▶ func index(after: Index) -> Index
 指定した位置の次の位置を算出
  109. 109. フォトアルバム CollectionType を適⽤
  110. 110. こんな感じにすると …
  111. 111. フォトアルバム Swift と会話が弾む
  112. 112. 楽しい!
  113. 113. 乱数ジェネレーター
  114. 114. 乱数ジェネレーター ▶ Int の乱数を⽣成する ▶ 次々と乱数を作り出せる 要件
  115. 115. ここで Swift の気持ちに寄り添う
  116. 116. 乱数ジェネレーターの性質 次々と乱数を⽣成できる型
  117. 117. 標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ Collection
 連続する複数要素を持ち、索引で扱える型の性質 ▶ Sequence
 連続する複数の要素を扱う型の性質 ▶ IteratorProtocol
 次へ次へと要素を取り出していける型の性質 ▶ Indexable, IndexableBase
 索引の範囲を取得し、添字で要素を参照できる性質 ▶ SignedInteger
 符号付き整数の性質 ▶ Comparable
 値の⼤⼩⽐較と同値性⽐較が可能な性質
  118. 118. 乱数ジェネレーターを IteratorProtocol に基づいて実装
  119. 119. GeneratorType の適⽤⽅法 性質を実現するために必要な機能 ▶ mutating func next() -> Element?
 次の要素を取得
  120. 120. 乱数ジェネレーター IteratorProtocol に基づいて実装
  121. 121. こんな感じにすると …
  122. 122. 乱数ジェネレーター Swift と会話が弾む
  123. 123. Swiftと仲良くなれた! かも?
  124. 124. Swift との会話を ぜひ楽しんでみてください
  125. 125. まとめ 主要3プロトコルを眺めてみる 1. 標準ライブラリの旅 ✓ Collection ✓ Sequence ✓ IteratorProtocol ✓ Indexable, IndexableBase ✓ Comparable 2. Swift に声をかけてみよう ✓ フォトアルバム ✓ 乱数ジェネレーター

×