Upload
tomohiro-kumagai
View
4.424
Download
1
Embed Size (px)
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 に声をかけてみよう
✓ フォトアルバム ✓ 乱数ジェネレーター