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

Preview:

Citation preview

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

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

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

Swift 2.2

熊⾕友宏

Xcode 5 徹底解説 MOSA

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

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

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

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

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

書籍 / 登壇

横浜 iPhone 開発者勉強会#yidev

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

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

#cswift

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

【 横浜・⻘葉台 】

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

勉強会

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

CodePiece

iOS, OS X, Apple Watch アプリ

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

いつもの電卓

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

⾳で再配達ゴッド

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

EZ-NET IP Phone

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

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

CodePiece for OS X

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

できること

#love_swift

前回

プロトコル

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

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

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

Swift の声をもっと聴きたい

今回

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

その前に…

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

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

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

⼈間界 霊界明確に分離

物質世界

精神世界

プロトコル

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

⼈間 (インスタンス)

⾒える ⾒えない⼲渉

閑話休題

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

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

▶ CollectionType ▶ SequenceType ▶ GeneratorType

たとえば、配列

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

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

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

Shortcut ⌃ ⌘ J

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

こんな機能を 持っている

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

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

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

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

Array<Element>: CollectionType

掘り下げてみよう

プロトコル観察(1)CollectionType

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

配列の特徴を想像

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

CollectionType の印象を想像

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

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

CollectionType を観察想像を以って

CollectionType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

プロトコルを 継承してる

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

なんだろう?

ややこしそう

内容を扱う

配列の切り出し

添字で参照

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

ややこしそう

配列の切り出し

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

CollectionType と 似た性質である

CollectionType を 知れば解りそう

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

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

残るのは この3つだけ

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

▶ Indexable ▶ SequenceType ▶ GeneratorType

索引付け可能?

連続型?

⽣成器型?

これなら 解りそうかも

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

▶ CollectionType

▶ SequenceType

▶ GeneratorType

▶ Indexable

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

観察中 …

未調査

未調査

増えた!

プロトコル観察(2)Indexable

Indexable の印象を想像

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

Indexable 観察定義を辿る

Shortcut ⌃ ⌘ J

Indexable 観察定義を眺める

また新しい プロトコル

索引の範囲表現

これはなに…?

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

これはなに…?

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

そういう時は 想像で OK !

Indexable 観察再び定義を眺める

残るのは この1つだけ

とりあえず 索引型?

Indexable がだいたいわかった

Indexableまとめ

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

Indexable世界観

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

なにか

startIndex endIndex

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

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

▶ CollectionType

▶ SequenceType

▶ GeneratorType

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

▶ ForwardIndexType増えた!

観察中 …

未調査

未調査

プロトコル観察(3)ForwardIndexType

ForwardIndexType の印象を想像

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

ForwardIndexType 観察定義を辿る

Shortcut ⌃ ⌘ J

ForwardIndexType 観察定義を眺める

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

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

他の索引との距離を得る

前⽅へ指定した距離 進む

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

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

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

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

同⼀性を判定

ForwardIndexType がだいたいわかった

ForwardIndexTypeまとめ

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

ForwardIndexType世界観

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

索引 A

索引 B

索引 C

索引 D

successor

advancedBy

distanceTo

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

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

▶ CollectionType

▶ SequenceType

▶ GeneratorType

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

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

観察中 …

未調査

未調査

プロトコル観察(4)SequenceType

SequenceType の印象を想像

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

SequenceType 観察定義を辿る

Shortcut ⌃ ⌘ J

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

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

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

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

こちらに注⽬

ざっと⾒て だいたい OK !

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

再び登場。 なんだろう?

Generator を ⽣成する?

プロトコル観察(5)GeneratorType

GeneratorType の印象を想像

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

GeneratorType 観察定義を辿る

Shortcut ⌃ ⌘ J

GeneratorType 観察定義を眺める

次の値を⽣み出す

GeneratorType がだいたいわかった

GeneratorTypeまとめ

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

GeneratorType世界観

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

next

生成器 要素

要素

要素

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

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

▶ CollectionType

▶ SequenceType

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

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

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

観察中 …

観察中 …

プロトコル観察(6)SequenceType

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

次々と値を⽣成できる型

連続した値を 取得できる

SequenceType がだいたいわかった

SequenceTypeまとめ

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

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

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

▶ CollectionType

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

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

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

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

観察中 …

プロトコル観察(7)CollectionType

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

索引でも扱える性質

この辺りは もう⼤丈夫

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

CollectionType がだいたいわかった

CollectionTypeまとめ

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

標準ライブラリの旅達成

標準ライブラリの旅達成

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

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

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

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

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

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

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

フォトアルバム

フォトアルバム

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

要件

フォトアルバム実装

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

フォトアルバムの性質

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

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

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

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

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

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

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

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

プロトコルの適⽤⽅法

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

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

勘所

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

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

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

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

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

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

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

フォトアルバムCollectionType を適⽤

こんな感じにすると …

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

楽しい!

乱数ジェネレーター

乱数ジェネレーター

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

要件

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

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

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

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

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

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

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

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

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

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

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

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

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

こんな感じにすると …

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

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

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

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

1. 標準ライブラリの旅

✓ CollectionType ✓ SequenceType ✓ GeneratorType ✓ Indexable ✓ ForwardIndexType

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

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