熊⾕友宏
http://ez-net.jp/
2016.04.24 … 集まれ Swift 好き!Swift 愛好会 #6
2017.03.21 … Swift 3.1 対応
主要3プロトコルを眺めてみる
Swift カジュアルプログラミング
Swift 3.1
前回の Swift 愛好会 にて
プロトコル
▶ 存在の感じ⽅
▶ 観察のしかた
▶ 読み進め⽅
繪⾯さんが⾒せてくれたこと
プロトコルを知ると
Swift の気持ちが⾒えてくる
Swift の声をもっと聴きたい
今回
プロトコルを実際に巡って
Swift の⼼に触れてみる
標準ライブラリの旅
主要3プロトコル 編
主要3プロトコル
気づかずに多⽤してるプロトコルたち
▶ Collection
▶ Sequence
▶ IteratorProtocol
たとえば、配列
配列ってこんな感じ
Array<Element>
配列って
他にどんな機能があるんだろう
配列の定義をたどる
Jump To Definition
Shortcut ⌃ ⌘ J
配列の定義
これまでの定義の⾒⽅
こんな機能を
持っている
配列の定義
新しい定義の⾒⽅
こんな性質も
持ち合わせている
プロトコルが
型に性質を与える
Collection が
配列らしさの根底にある
Array<Element>: Collection
掘り下げてみよう
プロトコル観察(1)
Collection
その前に
想像してみてください
配列の特徴を想像
▶ 複数の要素を内包する
▶ 添字を使って要素を取り出せる
▶ 部分配列を切り出せる
Collection の印象を想像
▶ 直訳すると、集約型
▶ 複数の要素を集めていそう
想像が
理解の⼤事な助けになる
Collection を観察
想像を以って
Collection 観察
定義を辿る
Shortcut ⌃ ⌘ J
Collection 観察
定義を眺める(とにかく気軽に🙂)
プロトコルを
継承してる
Collection 観察
もう少し定義を眺める(とにかく気軽に🙂)
なんだろう?
ややこしそう
内容を扱う
配列の切り出し
添字で参照
Collection 観察
再び定義を眺める(とにかく気軽に🙂)
ややこしそう
配列の切り出し
配列切り出しで
使っていた
Collection と
似た性質である
Collection を
知れば解りそう
とりあえず
部分配列っぽい
Collection 観察
ここまでの理解で定義を⾒渡す
残るのは
この4つだけ
Collection 観察
まだ判らないプロトコル
▶ Indexable
▶ Sequence
▶ IteratorProtocol
▶ IndexableBase
索引付け可能?
連続型?
⽣成器型?
これなら
解りそうかも
索引付け可能、の⼟台?
これなら
解りそうかも
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

▶ Indexable, IndexableBase



標準ライブラリの旅
ここまでの まとめ
観察中 …
未調査
未調査
増えた!
プロトコル観察(2)
Indexable
Indexable の印象を想像
▶ 直訳すると、索引付け可能
▶ 索引で何かを扱えそう
Indexable 観察
定義を辿る
Shortcut ⌃ ⌘ J
Indexable 観察
定義を眺める


また新しい
プロトコル
索引を
距離で移動
さっきも⾒たけど
まだ知らない
索引から
距離を算出
Indexable 観察
再び定義を眺める


また新しい
プロトコル
さっきも⾒たけど
まだ知らない
とりあえず
符号付き整数?
とりあえず
Indexable の基盤?
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

▶ Indexable, IndexableBase

▶ SignedInteger

増えた!
観察中 …
標準ライブラリの旅
ここまでの まとめ
観察中 …
未調査
未調査
プロトコル観察(3)
IndexableBase
IndexableBase の印象を想像
▶ 索引付け可能にするための⼟台?
▶ Indexable の基盤になってそう
IndexableBase 観察
定義を辿る
Shortcut ⌃ ⌘ J
IndexableBase 観察
定義を眺める
また新しい
プロトコル
索引の範囲表現
索引の範囲表現
これはなに…?
IndexableBase 観察
調べやすそうなところに注⽬
これはなに…?
全く⼿がかりを
読み取れない …
そういう時は
想像で OK !
IndexableBase 観察
再び定義を眺める
残るのは
この1つだけ
とりあえず
⽐較可能?
Indexable, IndexableBase が
だいたいわかった
IndexableBase
まとめ
▶ 索引の範囲を取得できる
▶ 添字で索引を添えてアクセスできる
Indexable
まとめ
▶ Indexable の性質を引き継ぐ
▶ それに加えて、距離の概念を持つ
Indexable
世界観
索引の範囲を取得でき、添字で要素を参照できる性質
索引には距離の概念があり、距離指定して移動可能
なにか
startIndex endIndex
標準ライブラリの旅
ここまでの まとめ
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

▶ Comparable
観察中 …
未調査
未調査
増えた!
未調査
プロトコル観察(4)
SignedInteger
SignedInteger の印象を想像
▶ 直訳すると、符号付き整数
▶ 普通に数として使えそう
SignedInteger 観察
定義を辿る
Shortcut ⌃ ⌘ J
SignedInteger 観察
定義を眺める
IntMax 型との
相互変換
名前的に 内部⽤…?
察しがつくので とりあえず OK
知らないプロトコル
でもたぶん 整数
SignedInteger が
だいたいわかった
SignedInteger
まとめ
▶ 符号付き整数
▶ 整数としての性質を持つ
標準ライブラリの旅
ここまでの まとめ
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable
観察中 …
未調査
未調査
未調査
プロトコル観察(5)
Comparable
Comparable の印象を想像
▶ 直訳すると、⽐較可能
▶ 2つの値を⽐較できそう
Comparable 観察
定義を辿る
Shortcut ⌃ ⌘ J
Comparable 観察
定義を眺める
不等号で⽐較
Equatable の

性質も持つ
等号で⽐較
Comparable が
だいたいわかった
SignedInteger
まとめ
▶ 値の⼤⼩を⽐較できる
▶ 値が同じか判定できる
Comparable
世界観
値を⽐較できる性質
値
値
標準ライブラリの旅
ここまでの まとめ
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
観察中 …
未調査
未調査
プロトコル観察(6)
Sequence
Sequence の印象を想像
▶ 直訳すると、連続型
▶ 連続した値を扱えそう
Sequence 観察
定義を辿る
Shortcut ⌃ ⌘ J
Sequence 観察
ざっくり定義を眺める
この辺が
性質を意味しそう
この辺は
性質がもたらす能⼒
SequenceType 観察
読みたいとこにアタリをつける
こちらに注⽬
ざっと⾒て
だいたい OK !
SequenceType 観察
アタリをつけたところを読む
再び登場。
なんだろう?
Iterator を
⽣成する?
プロトコル観察(7)
IteratorProtocol
IteratorProtocol の印象を想像
▶ 直訳すると、反復器を表すプロトコル
▶ 繰り返し処理で使いそう
IteratorProtocol 観察
定義を辿る
Shortcut ⌃ ⌘ J
IteratorProtocol 観察
定義を眺める
次の値を取得する
IteratorProtocol が
だいたいわかった
IteratorProtocol
まとめ
▶ 次の要素を取り出せる
▶ 取り出せない可能性もある
IteratorProtocol
世界観
次へ次へと要素を
取り出していける型の性質
next
反復器 要素
要素
要素
標準ライブラリの旅
ここまでの まとめ
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

▶ IteratorProtocol

次へ次へと要素を取り出していける型の性質
▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
観察中 …
観察中 …
プロトコル観察(8)
Sequence
Sequence 観察
ここまでくると意味が汲める
次々と値を

取得できる型
次々と値を
取得できる反復器を作る
Sequence が
だいたいわかった
Sequence
まとめ
▶ 連続する要素を扱う型
▶ 要素を次々に得る概念を持つ
▶ 要素の並び順までは語られてなさそう
Sequence
世界観
連続する複数の要素を扱う型の性質
反復器を通して要素を次々と取得できる
makeIterator
反復器
要素
要素
要素
要素 要素 要素 要素
標準ライブラリの旅
ここまでの まとめ
標準ライブラリの旅
ここまでの まとめ
▶ Collection

▶ Sequence

連続する複数の要素を扱う型の性質
▶ IteratorProtocol

次へ次へと要素を取り出していける型の性質
▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
観察中 …
プロトコル観察(9)
Collection
Collection 観察
改めて定義を⾒渡す 要素を連続的に取得でき、
索引でも扱える性質
この辺りは
もう⼤丈夫
内包する要素を
ひとつずつ取得
Collection が
だいたいわかった
Collection
まとめ
▶ 複数要素を集めて扱う型
▶ 要素は連続的で、索引で取り扱える性質を持つ
▶ 要素を次々に得る概念を持つ
Collection
世界観
連続する複数の要素を扱う型の性質
反復器や索引を通して要素を⾃由に取得できる
反復器
要素
要素
要素
要素 要素 要素 要素 要素
startIndex endIndex
要素
makeIterator
標準ライブラリの旅
達成
標準ライブラリの旅
達成
▶ Collection

連続する複数要素を持ち、索引で扱える型の性質
▶ Sequence

連続する複数の要素を扱う型の性質
▶ IteratorProtocol

次へ次へと要素を取り出していける型の性質
▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
プロトコルの性質を知って活かすと
Swift がもっと楽しくなる!
Swift に声をかけてみよう
Swift の気持ちになって接する
フォトアルバム
フォトアルバム
▶ ひとつのデータ構造で表現する
▶ 複数枚の写真を収録する
▶ アルバムには表題を設定できる
▶ アルバム内の写真を⾃由に⾒られる
要件
フォトアルバム
実装
ここで
Swift の気持ちに寄り添う
フォトアルバムの性質
複数の写真を持ち、⾃由に眺められる
標準ライブラリの旅
同じ性質のプロトコルを探してみる
▶ Collection

連続する複数要素を持ち、索引で扱える型の性質
▶ Sequence

連続する複数の要素を扱う型の性質
▶ IteratorProtocol

次へ次へと要素を取り出していける型の性質
▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
フォトアルバムに
Collection を適⽤
プロトコルの適⽤⽅法
▶ プロトコルが持つ性質を

実現するための振る舞いを実装する

▶ 性質から⾃然と導かれる振る舞いは

普通は実装しなくて良い

勘所
↑ その性質を持つことを約束するために必須
↑ 性質に基づいて既に規定されてる
具体的には …
プロトコルで規定されている概念のうち、
extension で実装されていないものを実装していく
CollectionType の適⽤⽅法
性質を実現するために必要な機能
▶ var startIndex: Index { get }

最初の要素が存在する位置を⽰す索引を取得
▶ var endIndex: Index { get }

最後の要素の次の位置を⽰す索引を取得
▶ subscript (position: Index) -> Element

指定した位置にある要素を取得
▶ func index(after: Index) -> Index

指定した位置の次の位置を算出
フォトアルバム
CollectionType を適⽤
こんな感じにすると …
フォトアルバム
Swift と会話が弾む
楽しい!
乱数ジェネレーター
乱数ジェネレーター
▶ Int の乱数を⽣成する
▶ 次々と乱数を作り出せる
要件
ここで
Swift の気持ちに寄り添う
乱数ジェネレーターの性質
次々と乱数を⽣成できる型
標準ライブラリの旅
同じ性質のプロトコルを探してみる
▶ Collection

連続する複数要素を持ち、索引で扱える型の性質
▶ Sequence

連続する複数の要素を扱う型の性質
▶ IteratorProtocol

次へ次へと要素を取り出していける型の性質
▶ Indexable, IndexableBase

索引の範囲を取得し、添字で要素を参照できる性質
▶ SignedInteger

符号付き整数の性質
▶ Comparable

値の⼤⼩⽐較と同値性⽐較が可能な性質
乱数ジェネレーターを
IteratorProtocol に基づいて実装
GeneratorType の適⽤⽅法
性質を実現するために必要な機能
▶ mutating func next() -> Element?

次の要素を取得
乱数ジェネレーター
IteratorProtocol に基づいて実装
こんな感じにすると …
乱数ジェネレーター
Swift と会話が弾む
Swiftと仲良くなれた!
かも?
Swift との会話を
ぜひ楽しんでみてください
まとめ
主要3プロトコルを眺めてみる
1. 標準ライブラリの旅
✓ Collection
✓ Sequence
✓ IteratorProtocol
✓ Indexable, IndexableBase
✓ Comparable
2. Swift に声をかけてみよう
✓ フォトアルバム
✓ 乱数ジェネレーター

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