117
EZ-NET 熊⾕友宏 http://ez-net.jp/ 2016.04.24 集まれ Swift 好き!Swift 愛好会 #6 主要3プロトコルを眺めてみる Swift カジュアルプログラミング Swift 2.2

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

Embed Size (px)

Citation preview

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

EZ-NET 熊⾕友宏 http://ez-net.jp/

2016.04.24 集まれ Swift 好き!Swift 愛好会 #6

主要3プロトコルを眺めてみるSwift カジュアルプログラミング

Swift 2.2

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

熊⾕友宏

Xcode 5 徹底解説 MOSA

Xcode 5 の全機能を徹底的に解説した本

OSX/iOS 系の歴史深い有料会員制の勉強会

紙版は絶版、電⼦書籍は販売中 2016-05-13 初⼼者向けセミナーで登壇

Xcode 7 でも役⽴つはず 法人会員も多数

@es_kumagai EZ-NET http://ez-net.jp/

書籍 / 登壇

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

横浜 iPhone 開発者勉強会#yidev

わいわい・ゆるく、iPhone 開発者のみんなで楽しく過ごすのが⽬的の会

【 横浜・⾺⾞道 】カジュアル Swift 勉強会

#cswift

ゆるくみんなで Swift を語らえる場を作りたくて始めた会

【 横浜・⻘葉台 】

第23回を 2016-05-07 に開催予定

勉強会

熊⾕友宏@es_kumagai EZ-NET http://ez-net.jp/

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

CodePiece

iOS, OS X, Apple Watch アプリ

ソースコードを Twitter と Gist に同時投稿できる。

いつもの電卓

計算式も⾒える電卓アプリ。 watchOS 1 対応

⾳で再配達ゴッド

簡単操作で 再配達の申し込み。

EZ-NET IP Phone

iPhone でひかり電話を使う。 ⾃宅 LAN からの利⽤専⽤

熊⾕友宏@es_kumagai EZ-NET http://ez-net.jp/

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

CodePiece for OS X

勉強会を楽しむアプリ ソースコードを Twitter と Gist に同時投稿できる勉強会で知⾒をみんなと共有したい時とかに便利!

できること

#love_swift

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

前回

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

プロトコル

▶ 存在の感じ⽅ ▶ 観察のしかた ▶ 読み進め⽅

繪⾯さんが⾒せてくれたこと

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

プロトコルを知るとSwift の気持ちが⾒えてくる

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

Swift の声をもっと聴きたい

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

今回

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

プロトコルを実際に巡ってSwift の⼼に触れてみる

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

その前に…

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

プロトコル指向に想う世界観どうやら誤解を招いた様⼦

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

プロトコル指向に想う世界観おそらく誤解を招いた部分

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

プロトコル指向に想う世界観明確に分離したいのは 世界観

⼈間界 霊界明確に分離

物質世界

精神世界

プロトコル

※ 世界の交わりの観点なら

⼈間 (インスタンス)

⾒える ⾒えない⼲渉

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

閑話休題

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

標準ライブラリの旅主要3プロトコル 編

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

主要3プロトコル気づかずに多⽤してるプロトコルたち

▶ CollectionType ▶ SequenceType ▶ GeneratorType

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

たとえば、配列

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

配列ってこんな感じArray<Element>

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

配列って他にどんな機能があるんだろう

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

配列の定義をたどるJump To Definition

Shortcut ⌃ ⌘ J

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

配列の定義これまでの定義の⾒⽅

こんな機能を 持っている

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

配列の定義新しい定義の⾒⽅

こんな性質も 持ち合わせている

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

プロトコルが型に性質を与える

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

CollectionType が配列らしさの根底にある

Array<Element>: CollectionType

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

掘り下げてみよう

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

プロトコル観察(1)CollectionType

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

その前に想像してみてください

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

配列の特徴を想像

▶ 複数の要素を内包する ▶ 添字を使って要素を取り出せる ▶ 部分配列を切り出せる

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

CollectionType の印象を想像

▶ 直訳すると、集約型 ▶ 複数の要素を集めていそう

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

想像が理解の⼤事な助けになる

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

CollectionType を観察想像を以って

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

CollectionType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

CollectionType 観察定義を眺める(とにかく気軽に🙂)

プロトコルを 継承してる

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

CollectionType 観察もう少し定義を眺める(とにかく気軽に🙂)

なんだろう?

ややこしそう

内容を扱う

配列の切り出し

添字で参照

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

CollectionType 観察再び定義を眺める(とにかく気軽に🙂)

ややこしそう

配列の切り出し

配列切り出しで 使っていた

CollectionType と 似た性質である

CollectionType を 知れば解りそう

とりあえず 部分配列っぽい

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

CollectionType 観察ここまでの理解で定義を⾒渡す

残るのは この3つだけ

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

CollectionType 観察まだ判らないプロトコル

▶ Indexable ▶ SequenceType ▶ GeneratorType

索引付け可能?

連続型?

⽣成器型?

これなら 解りそうかも

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

標準ライブラリの旅ここまでの まとめ

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

▶ CollectionType

▶ SequenceType

▶ GeneratorType

▶ Indexable

標準ライブラリの旅ここまでの まとめ

観察中 …

未調査

未調査

増えた!

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

プロトコル観察(2)Indexable

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

Indexable の印象を想像

▶ 直訳すると、索引付け可能 ▶ 索引で何かを扱えそう

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

Indexable 観察定義を辿る

Shortcut ⌃ ⌘ J

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

Indexable 観察定義を眺める

また新しい プロトコル

索引の範囲表現

これはなに…?

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

Indexable 観察調べやすそうなところに注⽬

これはなに…?

全く⼿がかりを 読み取れない …

そういう時は 想像で OK !

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

Indexable 観察再び定義を眺める

残るのは この1つだけ

とりあえず 索引型?

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

Indexable がだいたいわかった

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

Indexableまとめ

▶ 索引の範囲を取得できる ▶ 添字で索引を添えてアクセスできる

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

Indexable世界観

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

なにか

startIndex endIndex

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

標準ライブラリの旅ここまでの まとめ

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

標準ライブラリの旅ここまでの まとめ

▶ CollectionType

▶ SequenceType

▶ GeneratorType

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

▶ ForwardIndexType増えた!

観察中 …

未調査

未調査

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

プロトコル観察(3)ForwardIndexType

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

ForwardIndexType の印象を想像

▶ 直訳すると、索引型 (IndexType) ▶ 前⽅に進んでいけそう

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

ForwardIndexType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

ForwardIndexType 観察定義を眺める

新登場だけど たぶん符号付き整数

内部⽤っぽいので 無視したいけど無理…

他の索引との距離を得る

前⽅へ指定した距離 進む

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

ForwardIndexType 観察しかたないので 定義を眺める

察するに… “増加可能” な性質

後続 (successor) を 取得するもの

察するに… “⽐較可能” な性質

同⼀性を判定

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

ForwardIndexType がだいたいわかった

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

ForwardIndexTypeまとめ

▶ 前⽅へ進める索引型 ▶ 任意の距離を指定して進める ▶ 索引型は⽐較可能

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

ForwardIndexType世界観

先へ先へと辿れる、 索引を表現する型の性質

索引 A

索引 B

索引 C

索引 D

successor

advancedBy

distanceTo

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

標準ライブラリの旅ここまでの まとめ

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

標準ライブラリの旅ここまでの まとめ

▶ CollectionType

▶ SequenceType

▶ GeneratorType

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

観察中 …

未調査

未調査

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

プロトコル観察(4)SequenceType

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

SequenceType の印象を想像

▶ 直訳すると、連続型 ▶ 連続した値を扱えそう

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

SequenceType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

SequenceType 観察ざっくり定義を眺める

この辺が 性質を意味しそう

この辺は 性質がもたらす能⼒

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

SequenceType 観察読みたいとこにアタリをつける

こちらに注⽬

ざっと⾒て だいたい OK !

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

SequenceType 観察アタリをつけたところを読む

再び登場。 なんだろう?

Generator を ⽣成する?

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

プロトコル観察(5)GeneratorType

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

GeneratorType の印象を想像

▶ 直訳すると、⽣成器型 ▶ 何かを⽣成できそう

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

GeneratorType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

GeneratorType 観察定義を眺める

次の値を⽣み出す

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

GeneratorType がだいたいわかった

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

GeneratorTypeまとめ

▶ 次の要素を⽣み出せる ▶ ⽣み出せない可能性もある

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

GeneratorType世界観

次へ次へと要素を ⽣み出していける型の性質

next

生成器 要素

要素

要素

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

標準ライブラリの旅ここまでの まとめ

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

標準ライブラリの旅ここまでの まとめ

▶ CollectionType

▶ SequenceType

▶ GeneratorType次へ次へと要素を⽣み出していける型の性質

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

観察中 …

観察中 …

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

プロトコル観察(6)SequenceType

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

SequenceType 観察ここまでくると意味が汲める

次々と値を⽣成できる型

連続した値を 取得できる

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

SequenceType がだいたいわかった

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

SequenceTypeまとめ

▶ 連続する要素を扱う型 ▶ 要素を次々に得る概念を持つ ▶ 要素の並び順までは語られてなさそう

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

標準ライブラリの旅ここまでの まとめ

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

標準ライブラリの旅ここまでの まとめ

▶ CollectionType

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

▶ GeneratorType次へ次へと要素を⽣み出していける型の性質

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

観察中 …

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

プロトコル観察(7)CollectionType

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

CollectionType 観察改めて定義を⾒渡す 要素を連続的に取得でき、

索引でも扱える性質

この辺りは もう⼤丈夫

内包する要素を ひとつずつ取得

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

CollectionType がだいたいわかった

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

CollectionTypeまとめ

▶ 複数要素を集めて扱う型 ▶ 要素は連続的で、索引で取り扱える性質を持つ ▶ 要素を次々に得る概念を持つ

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

標準ライブラリの旅達成

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

標準ライブラリの旅達成

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

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

▶ GeneratorType次へ次へと要素を⽣み出していける型の性質

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

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

プロトコルの性質を知って活かすとSwift がもっと楽しくなる!

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

Swift に声をかけてみようSwift の気持ちになって接する

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

フォトアルバム

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

フォトアルバム

▶ ひとつのデータ構造で表現する ▶ 複数枚の写真を収録する ▶ アルバムには表題を設定できる ▶ アルバム内の写真を⾃由に⾒られる

要件

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

フォトアルバム実装

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

ここでSwift の気持ちに寄り添う

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

フォトアルバムの性質

複数の写真を持ち、⾃由に眺められる

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

標準ライブラリの旅同じ性質のプロトコルを探してみる

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

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

▶ GeneratorType次へ次へと要素を⽣み出していける型の性質

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

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

フォトアルバムにCollectionType を適⽤

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

プロトコルの適⽤⽅法

▶ プロトコルが持つ性質を実現するための振る舞いを実装する

▶ 性質から⾃然と導かれる振る舞いは普通は実装しなくて良い

勘所

↑ その性質を持つことを約束するために必須

↑ 性質に基づいて既に規定されてる

具体的には …プロトコルで規定されている概念のうち、 extension で実装されていないものを実装していく

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

CollectionType の適⽤⽅法性質を実現するために必要な機能

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

▶ var endIndex: Index { get }最後の要素の次の位置を⽰す索引を取得

▶ subscript (position: Index) ->Element { get }指定した位置にある要素を取得

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

フォトアルバムCollectionType を適⽤

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

こんな感じにすると …

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

フォトアルバムSwift と会話が弾む

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

楽しい!

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

乱数ジェネレーター

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

乱数ジェネレーター

▶ UInt32 の乱数を⽣成する ▶ 次々と乱数を作り出せる

要件

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

ここでSwift の気持ちに寄り添う

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

乱数ジェネレーターの性質

次々と乱数を⽣成できる型

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

標準ライブラリの旅同じ性質のプロトコルを探してみる

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

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

▶ GeneratorType次へ次へと要素を⽣み出していける型の性質

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

▶ ForwardIndexType先へ先へと辿れる索引を表現する型の性質

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

乱数ジェネレーターをGeneratorType に基づいて実装

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

GeneratorType の適⽤⽅法性質を実現するために必要な機能

▶ mutating func next() -> Element?次の要素を⽣成

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

乱数ジェネレーターGeneratorType に基づいて実装

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

こんな感じにすると …

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

乱数ジェネレーターSwift と会話が弾む

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

Swiftと仲良くなれた!かも?

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

Swift との会話をぜひ楽しんでみてください

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

まとめ主要3プロトコルを眺めてみる

1. 標準ライブラリの旅

✓ CollectionType ✓ SequenceType ✓ GeneratorType ✓ Indexable ✓ ForwardIndexType

2. Swift に声をかけてみよう

✓ フォトアルバム ✓ 乱数ジェネレーター