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

130 Views

April 24, 16

スライド概要

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

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 6,824 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

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

2.

熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ 書籍 / 登壇 Xcode 5 徹底解説 MOSA Xcode 5 の全機能を 徹底的に解説した本 OSX/iOS 系の歴史深い 有料会員制の勉強会 Xcode 7 でも役⽴つはず 法人会員も多数 紙版は絶版、電⼦書籍は販売中 2016-05-13 初⼼者向けセミナーで登壇

3.

熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ 勉強会 横浜 iPhone 開発者勉強会 カジュアル Swift 勉強会 【 横浜・⾺⾞道 】 #yidev 【 横浜・⻘葉台 】 #cswift わいわい・ゆるく、iPhone 開発者の みんなで楽しく過ごすのが⽬的の会 ゆるくみんなで Swift を語らえる場を 作りたくて始めた会 第23回を 2016-05-07 に開催予定

4.

熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ iOS, OS X, Apple Watch アプリ CodePiece いつもの電卓 ソースコードを Twitter と Gist に同時投稿できる。 計算式も⾒える電卓アプリ。 watchOS 1 対応 ⾳で再配達ゴッド EZ-NET IP Phone 簡単操作で 再配達の申し込み。 iPhone でひかり電話を使う。 ⾃宅 LAN からの利⽤専⽤

5.

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

6.

前回

7.

プロトコル 繪⾯さんが⾒せてくれたこと ▶ 存在の感じ⽅ ▶ 観察のしかた ▶ 読み進め⽅

8.

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

9.

Swift の声をもっと聴きたい

10.

今回

11.

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

12.

その前に…

13.

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

14.

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

15.

プロトコル指向に想う世界観 明確に分離したいのは 世界観 人間界 霊界 明確に分離 精神世界 物質世界 人間 型 プロトコル (インスタンス) 見える 見えない ※ 世界の交わりの観点なら

16.

閑話休題

17.

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

18.

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

19.

たとえば、配列

20.

配列ってこんな感じ Array<Element> ӲҹҬӵᥨҷᢅ MFUWBMVFT<  > ञӒൺӂᖌ඾ӘఌӘᥨҷᢅ MFUWBMVFT<*OU><  > MFUWBMVFT"SSBZ*OU<  > ㌔ఇӘᮿ⥎ҶਜҲӵ WBMVFTDPVOU WBMVFTTPSU  

21.

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

22.

配列の定義をたどる Jump To Definition MFUWBMVFT"SSBZ*OU<  > Shortcut ⌃ ⌘ J

23.

配列の定義 これまでの定義の⾒⽅ こんな機能を TUSVDU"SSBZ&MFNFOU 持っている $PMMFDUJPO5ZQF .VUBCMF$PMMFDUJPO5ZQF  @%FTUSVDUPS4BGF$POUBJOFS\ WBSTUBSU*OEFY*OU\HFU^ WBSFOE*OEFY*OU\HFU^ TVCTDSJQU JOEFY*OU &MFNFOU TVCTDSJQU TVC3BOHF3BOHF*OU  "SSBZ4MJDF&MFNFOU ^ FYUFOTJPO"SSBZ"SSBZ-JUFSBM$POWFSUJCMF\ JOJU BSSBZ-JUFSBMFMFNFOUT&MFNFOU 

24.

配列の定義 新しい定義の⾒⽅ TUSVDU"SSBZ&MFNFOU $PMMFDUJPO5ZQF .VUBCMF$PMMFDUJPO5ZQF  @%FTUSVDUPS4BGF$POUBJOFS\ WBSTUBSU*OEFY*OU\HFU^ WBSFOE*OEFY*OU\HFU^ こんな性質も TVCTDSJQU JOEFY*OU &MFNFOU持ち合わせている TVCTDSJQU TVC3BOHF3BOHF*OU  "SSBZ4MJDF&MFNFOU ^ FYUFOTJPO"SSBZ"SSBZ-JUFSBM$POWFSUJCMF\ JOJU BSSBZ-JUFSBMFMFNFOUT&MFNFOU 

25.

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

26.

Array<Element>: CollectionType CollectionType が 配列らしさの根底にある

27.

掘り下げてみよう

28.

プロトコル観察(1) CollectionType

29.

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

30.

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

31.

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

32.

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

33.

想像を以って CollectionType を観察

34.

CollectionType 観察 定義を辿る $PMMFDUJPO5ZQF Shortcut ⌃ ⌘ J

35.

CollectionType 観察 定義を眺める(とにかく気軽に🙂) QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS プロトコルを 継承してる BTTPDJBUFEUZQF4VC4FRVFODF*OEFYBCMF 4FRVFODF5ZQF TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ TVCTDSJQU CPVOET3BOHF*OEFY 4VC4FRVFODF GVODQSFGJY6Q5P FOE*OEFY 4VC4FRVFODF GVODTVGGJY'SPN TUBSU*OEFY 4VC4FRVFODF GVODQSFGJY5ISPVHI QPTJUJPO*OEFY 4VC4FRVFODF WBSJT&NQUZ#PPM\HFU^ WBSDPVOU*OEFY%JTUBODF\HFU^ WBSGJSTU(FOFSBUPS&MFNFOU \HFU^ ^

36.

CollectionType 観察 もう少し定義を眺める(とにかく気軽に🙂) QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ なんだろう? BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS ややこしそう BTTPDJBUFEUZQF4VC4FRVFODF*OEFYBCMF 4FRVFODF5ZQF TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ TVCTDSJQU CPVOET3BOHF*OEFY 4VC4FRVFODF GVODQSFGJY6Q5P FOE*OEFY 4VC4FRVFODF GVODTVGGJY'SPN TUBSU*OEFY 4VC4FRVFODF GVODQSFGJY5ISPVHI QPTJUJPO*OEFY 4VC4FRVFODF WBSJT&NQUZ#PPM\HFU^ WBSDPVOU*OEFY%JTUBODF\HFU^ WBSGJSTU(FOFSBUPS&MFNFOU \HFU^ ^ 添字で参照 配列の切り出し 内容を扱う

37.

CollectionType 観察 再び定義を眺める(とにかく気軽に🙂) QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF 配列切り出しで GVODHFOFSBUF 使っていた (FOFSBUPS ややこしそう BTTPDJBUFEUZQF4VC4FRVFODF*OEFYBCMF 4FRVFODF5ZQF TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ CollectionType と 似た性質である TVCTDSJQU CPVOET3BOHF*OEFY 4VC4FRVFODF GVODQSFGJY6Q5P FOE*OEFY 4VC4FRVFODF GVODTVGGJY'SPN TUBSU*OEFY 4VC4FRVFODF GVODQSFGJY5ISPVHI QPTJUJPO*OEFY 4VC4FRVFODF CollectionType を 知れば解りそう WBSJT&NQUZ#PPM\HFU^ WBSDPVOU*OEFY%JTUBODF\HFU^ とりあえず WBSGJSTU(FOFSBUPS&MFNFOU \HFU^ 部分配列っぽい ^ 配列の切り出し

38.

CollectionType 観察 ここまでの理解で定義を⾒渡す 残るのは この3つだけ QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS BTTPDJBUFEUZQF4VC4FRVFODF*OEFYBCMF 4FRVFODF5ZQF TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ TVCTDSJQU CPVOET3BOHF*OEFY 4VC4FRVFODF GVODQSFGJY6Q5P FOE*OEFY 4VC4FRVFODF GVODTVGGJY'SPN TUBSU*OEFY 4VC4FRVFODF GVODQSFGJY5ISPVHI QPTJUJPO*OEFY 4VC4FRVFODF WBSJT&NQUZ#PPM\HFU^ WBSDPVOU*OEFY%JTUBODF\HFU^ WBSGJSTU(FOFSBUPS&MFNFOU \HFU^ ^

39.

CollectionType 観察 まだ判らないプロトコル これなら 解りそうかも ▶ Indexable 索引付け可能? ▶ SequenceType 連続型? ▶ GeneratorType ⽣成器型?

40.

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

41.

標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 増えた!

42.

プロトコル観察(2) Indexable

43.

Indexable の印象を想像 ▶ 直訳すると、索引付け可能 ▶ 索引で何かを扱えそう

44.

Indexable 観察 定義を辿る *OEFYBCMF Shortcut ⌃ ⌘ J

45.

Indexable 観察 定義を眺める また新しい プロトコル QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ これはなに…? 索引の範囲表現

46.

Indexable 観察 調べやすそうなところに注⽬ QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ これはなに…? 全く⼿がかりを 読み取れない … そういう時は 想像で OK !

47.

Indexable 観察 再び定義を眺める QSPUPDPM*OEFYBCMF\ 残るのは この1つだけ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ とりあえず 索引型?

48.

Indexable が だいたいわかった

49.

Indexable まとめ ⺙ᙟӘ᚟⚳ QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ ▶ 索引の範囲を取得できる ▶ 添字で索引を添えてアクセスできる

50.

Indexable 世界観 索引の範囲を取得でき、 添字で要素を参照 できる性質 なにか startIndex endIndex 㔸ᄇ৴⡕ ✳▧৴⡕ ᷵ᆻӑ✝ᐠӼ᷵ҲӐ⺙✛Ӽീ῍

51.

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

52.

標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 増えた!

53.

プロトコル観察(3) ForwardIndexType

54.

ForwardIndexType の印象を想像 ▶ 直訳すると、索引型 (IndexType) ▶ 前⽅に進んでいけそう

55.

ForwardIndexType 観察 定義を辿る 'PSXBSE*OEFY5ZQF Shortcut ⌃ ⌘ J

56.

ForwardIndexType 観察 定義を眺める 内部⽤っぽいので 無視したいけど無理… QSPUPDPM'PSXBSE*OEFY5ZQF@*ODSFNFOUBCMF\ BTTPDJBUFEUZQF%JTUBODF@4JHOFE*OUFHFS5ZQF*OU GVODBEWBODFE#Z O%JTUBODF 4FMG GVODBEWBODFE#Z O%JTUBODF MJNJU4FMG 4FMG GVODEJTUBODF5P FOE4FMG %JTUBODF ^ 新登場だけど たぶん符号付き整数 前⽅へ 指定した距離 進む 他の索引との 距離を得る

57.

ForwardIndexType 観察 しかたないので 定義を眺める 察するに… “増加可能” な性質 QSPUPDPM@*ODSFNFOUBCMF&RVBUBCMF\ GVODTVDDFTTPS ^ 4FMG 後続 (successor) を 取得するもの 察するに… “⽐較可能” な性質 QSPUPDPM&RVBUBCMF\ GVOD MIT4FMG SIT4FMG #PPM ^ 同⼀性を判定

58.

ForwardIndexType が だいたいわかった

59.

ForwardIndexType まとめ ⺙ᙟӘ᚟⚳ QSPUPDPM'PSXBSE*OEFY5ZQF@*ODSFNFOUBCMF\ BTTPDJBUFEUZQF%JTUBODF@4JHOFE*OUFHFS5ZQF*OU GVODBEWBODFE#Z O%JTUBODF 4FMG GVODBEWBODFE#Z O%JTUBODF MJNJU4FMG 4FMG GVODEJTUBODF5P FOE4FMG %JTUBODF ^ QSPUPDPM@*ODSFNFOUBCMF&RVBUBCMF\ GVODTVDDFTTPS ^ 4FMG ▶ 前⽅へ進める索引型 ▶ 任意の距離を指定して進める ▶ 索引型は⽐較可能

60.

ForwardIndexType 世界観 先へ先へと辿れる、 索引を表現する 型の性質 ᰪӘ✝ᐠӼ൐ᒉ 索引 A successor distanceTo 索引 B 㮬ӎӘ✝ᐠ㔿Әヮ㘊 advancedBy Ꮇӎҵ୩Ә✝ᐠӼ൐ᒉ 索引 C ◠਺Ღ㆜ 索引 D

61.

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

62.

標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

63.

プロトコル観察(4) SequenceType

64.

SequenceType の印象を想像 ▶ 直訳すると、連続型 ▶ 連続した値を扱えそう

65.

SequenceType 観察 定義を辿る 4FRVFODF5ZQF Shortcut ⌃ ⌘ J

66.

SequenceType 観察 ざっくり定義を眺める QSPUPDPM4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF BTTPDJBUFEUZQF4VC4FRVFODF GVODHFOFSBUF (FOFSBUPS この辺が 性質を意味しそう この辺は 性質がもたらす能⼒ GVODVOEFSFTUJNBUF$PVOU *OU GVODNBQ5 USBOTGPSN (FOFSBUPS&MFNFOU 5 <5> GVODGJMUFS JODMVEF&MFNFOU (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<(FOFSBUPS&MFNFOU> GVODGPS&BDI CPEZ (FOFSBUPS&MFNFOU 7PJE  GVODESPQ'JSTU O*OU 4VC4FRVFODF GVODESPQ-BTU O*OU 4VC4FRVFODF GVODQSFGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTVGGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTQMJU NBY4QMJU*OU BMMPX&NQUZ4MJDFT#PPM  ѫѫѫѫѫѫѫѫѫJT4FQBSBUPS (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<4VC4FRVFODF> ^

67.

SequenceType 観察 読みたいとこにアタリをつける QSPUPDPM4FRVFODF5ZQF\ こちらに注⽬ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF BTTPDJBUFEUZQF4VC4FRVFODF GVODHFOFSBUF (FOFSBUPS ざっと⾒て だいたい OK ! GVODVOEFSFTUJNBUF$PVOU *OU GVODNBQ5 USBOTGPSN (FOFSBUPS&MFNFOU 5 <5> GVODGJMUFS JODMVEF&MFNFOU (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<(FOFSBUPS&MFNFOU> GVODGPS&BDI CPEZ (FOFSBUPS&MFNFOU 7PJE  GVODESPQ'JSTU O*OU 4VC4FRVFODF GVODESPQ-BTU O*OU 4VC4FRVFODF GVODQSFGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTVGGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTQMJU NBY4QMJU*OU BMMPX&NQUZ4MJDFT#PPM  ѫѫѫѫѫѫѫѫѫJT4FQBSBUPS (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<4VC4FRVFODF> ^

68.

SequenceType 観察 アタリをつけたところを読む QSPUPDPM4FRVFODF5ZQF\ 再び登場。 なんだろう? BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF BTTPDJBUFEUZQF4VC4FRVFODF GVODHFOFSBUF (FOFSBUPS GVODVOEFSFTUJNBUF$PVOU *OU Generator を GVODNBQ5 USBOTGPSN (FOFSBUPS&MFNFOU 5 <5>⽣成する? GVODGJMUFS JODMVEF&MFNFOU (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<(FOFSBUPS&MFNFOU> GVODGPS&BDI CPEZ (FOFSBUPS&MFNFOU 7PJE  GVODESPQ'JSTU O*OU 4VC4FRVFODF GVODESPQ-BTU O*OU 4VC4FRVFODF GVODQSFGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTVGGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTQMJU NBY4QMJU*OU BMMPX&NQUZ4MJDFT#PPM  ѫѫѫѫѫѫѫѫѫJT4FQBSBUPS (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<4VC4FRVFODF> ^

69.

プロトコル観察(5) GeneratorType

70.

GeneratorType の印象を想像 ▶ 直訳すると、⽣成器型 ▶ 何かを⽣成できそう

71.

GeneratorType 観察 定義を辿る (FOFSBUPS5ZQF Shortcut ⌃ ⌘ J

72.

GeneratorType 観察 定義を眺める QSPUPDPM(FOFSBUPS5ZQF\ BTTPDJBUFEUZQF&MFNFOU NVUBUJOHGVODOFYU ^ &MFNFOU  次の値を⽣み出す

73.

GeneratorType が だいたいわかった

74.

GeneratorType まとめ ⺙ᙟӘ᚟⚳ QSPUPDPM(FOFSBUPS5ZQF\ BTTPDJBUFEUZQF&MFNFOU NVUBUJOHGVODOFYU ^ &MFNFOU  ▶ 次の要素を⽣み出せる ▶ ⽣み出せない可能性もある

75.

GeneratorType 世界観 次へ次へと要素を ⽣み出していける 型の性質 ᰪӘ⺙✛Ӽ⇰ᘻ next 要素 生成器 要素 要素

76.

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

77.

標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 観察中 … ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

78.

プロトコル観察(6) SequenceType

79.

SequenceType 観察 ここまでくると意味が汲める QSPUPDPM4FRVFODF5ZQF\ 次々と値を ⽣成できる型 BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF BTTPDJBUFEUZQF4VC4FRVFODF GVODHFOFSBUF (FOFSBUPS GVODVOEFSFTUJNBUF$PVOU *OU 連続した値を GVODNBQ5 USBOTGPSN (FOFSBUPS&MFNFOU 5 <5> 取得できる GVODGJMUFS JODMVEF&MFNFOU (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<(FOFSBUPS&MFNFOU> GVODGPS&BDI CPEZ (FOFSBUPS&MFNFOU 7PJE  GVODESPQ'JSTU O*OU 4VC4FRVFODF GVODESPQ-BTU O*OU 4VC4FRVFODF GVODQSFGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTVGGJY NBY-FOHUI*OU 4VC4FRVFODF GVODTQMJU NBY4QMJU*OU BMMPX&NQUZ4MJDFT#PPM  ѫѫѫѫѫѫѫѫѫJT4FQBSBUPS (FOFSBUPS&MFNFOU #PPM  ѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫѫ<4VC4FRVFODF> ^

80.

SequenceType が だいたいわかった

81.

SequenceType まとめ ⺙ᙟӘ᚟⚳ QSPUPDPM4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF ^ (FOFSBUPS ▶ 連続する要素を扱う型 ▶ 要素を次々に得る概念を持つ ▶ 要素の並び順までは語られてなさそう

82.

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

83.

標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

84.

プロトコル観察(7) CollectionType

85.

CollectionType 観察 改めて定義を⾒渡す 要素を連続的に取得でき、 索引でも扱える性質 QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS 内包する要素を ひとつずつ取得 BTTPDJBUFEUZQF4VC4FRVFODF*OEFYBCMF 4FRVFODF5ZQF TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ TVCTDSJQU CPVOET3BOHF*OEFY 4VC4FRVFODF GVODQSFGJY6Q5P FOE*OEFY 4VC4FRVFODF GVODTVGGJY'SPN TUBSU*OEFY 4VC4FRVFODF GVODQSFGJY5ISPVHI QPTJUJPO*OEFY 4VC4FRVFODF WBSJT&NQUZ#PPM\HFU^ WBSDPVOU*OEFY%JTUBODF\HFU^ WBSGJSTU(FOFSBUPS&MFNFOU \HFU^ ^ この辺りは もう⼤丈夫

86.

CollectionType が だいたいわかった

87.

CollectionType まとめ ⺙ᙟӘ᚟⚳ QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ ^ ▶ 複数要素を集めて扱う型 ▶ 要素は連続的で、索引で取り扱える性質を持つ ▶ 要素を次々に得る概念を持つ

88.

標準ライブラリの旅 達成

89.

標準ライブラリの旅 達成 ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

90.

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

91.

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

92.

フォトアルバム

93.

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

94.

フォトアルバム 実装 ӜӒӎӘԯդԧ᭜㉏ӑⷭ⅁Ӄӵ TUSVDU1IPUP"MCVN\  ⹋ᡔ᧞Әந⍞Ӽൊ㑤Ӄӵ WBSQIPUPT"SSBZ1IPUP  ԊՓԸՈӕәⷭ㛸Ӽ⼀ᇰӑҷӵ WBSUJUMF4USJOH  ԊՓԸՈ஗Әந⍞Ӽ⧞∀ӕ⺠ӳӶӵ TVCTDSJQU JOEFY*OU 1IPUP\ SFUVSOQIPUPT<QIPUPTTUBSU*OEFYBEWBODFE#Z JOEFY > ^ ^

95.

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

96.

フォトアルバム の性質 複数の写真を持ち、自由に眺められる

97.

標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

98.

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

99.

プロトコルの適⽤⽅法 勘所 ▶ プロトコルが持つ性質を 実現するための振る舞いを実装する ↑ その性質を持つことを約束するために必須 ▶ 性質から⾃然と導かれる振る舞いは 普通は実装しなくて良い ↑ 性質に基づいて既に規定されてる 具体的には … プロトコルで規定されている概念のうち、 extension で実装されていないものを実装していく

100.

CollectionType の適⽤⽅法 性質を実現するために必要な機能 ▶ var startIndex: Index { get } 最初の要素が存在する位置を⽰す索引を取得 ▶ var endIndex: Index { get } 最後の要素の次の位置を⽰す索引を取得 ▶ subscript (position: Index) ->Element { get } 指定した位置にある要素を取得

101.

フォトアルバム CollectionType を適⽤ ӜӒӎӘԯդԧ᭜㉏ӑⷭ⅁Ӄӵ TUSVDU1IPUP"MCVN$PMMFDUJPO5ZQF\  ⹋ᡔ᧞Әந⍞Ӽൊ㑤Ӄӵ WBSQIPUPT"SSBZ1IPUP  ԊՓԸՈӕәⷭ㛸Ӽ⼀ᇰӑҷӵ WBSUJUMF4USJOH  ԊՓԸՈ஗Әந⍞Ӽ⧞∀ӕ⺠ӳӶӵ TVCTDSJQU JOEFY*OU 1IPUP\ SFUVSOQIPUPT<QIPUPTTUBSU*OEFYBEWBODFE#Z JOEFY > ^ ந⍞Ә㔸ᄇ৴⡕Ӽ൐ᒉ WBSTUBSU*OEFY*OU\ SFUVSO ^  ந⍞Әᦎ▧৴⡕Ӽ൐ᒉ WBSFOE*OEFY*OU\ SFUVSOQIPUPTDPVOU  ^ ^

102.

こんな感じにすると …

103.

フォトアルバム Swift と会話が弾む MFUBMCVN1IPUP"MCVN QIPUPTQIPUPT UJUMF.Z"MCVN  ந⍞Әൊ㑤ᡔӼᡉҲӐ㮹 BMCVNDPVOU ᥰఉӘந⍞Ҷ⺠ӉҮ㮛 BMCVNGJSTU 㮭ӎӫӘந⍞ә㮹 BMCVN<> ᧀউӘந⍞ӊһ⺠ӉҮ㮛 BMCVNGJMUFS\MPDBUJPO5PLZP^ ԊՓԸՈӕநӍӐҮӵ঑ә㮹 MFUQFSTPOT*O"MCVNBMCVNGMBU.BQ\QFSTPOT^

104.

楽しい!

105.

乱数ジェネレーター

106.

乱数ジェネレーター 要件 ▶ UInt32 の乱数を⽣成する ▶ 次々と乱数を作り出せる

107.

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

108.

乱数ジェネレーターの 性質 次々と乱数を生成できる型

109.

標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質

110.

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

111.

GeneratorType の適⽤⽅法 性質を実現するために必要な機能 ▶ mutating func next() -> Element? 次の要素を⽣成

112.

乱数ジェネレーター GeneratorType に基づいて実装 ॢᡔӼ⇰ᘻӃӵԠԏԵՔդԧդ TUSVDU3BOEPN(FOFSBUPS(FOFSBUPS5ZQF\  QSJWBUFWBSY6*OU QSJWBUFWBSZ6*OU QSJWBUFWBS[6*OU QSJWBUFWBSX6*OU  ᰪӘॢᡔӼ⇰ᘻ NVUBUJOHGVODOFYU 6*OU \ MFUUY? Y   YZZ[[X X X? X ? U? U  SFUVSOX ^ ^ 

113.

こんな感じにすると …

114.

乱数ジェネレーター Swift と会話が弾む JNQPSU%BSXJO$ WBSSBOEPN3BOEPN(FOFSBUPS Y Z  [ XBSDSBOEPN  ᰪӘॢᡔҶᰲӁҮ SBOEPNOFYU  ҿӳӕᰪӘॢᡔҶᰲӁҮ SBOEPNOFYU  ㉒❰ӃӵॢᡔઙҶᰲӁҮ MFUSBOEPN4FRVFODF"OZ4FRVFODF\SBOEPN^ Խԑ԰ԊՓԸՈӘந⍞ӼԟՋԫԽՓӃӵ㮛 MFUQIPUPT[JQ BMCVN SBOEPN4FRVFODF ந⍞ӒॢᡔӼᦲӗӐѬ TPSU\^ॢᡔӑलӝ᥯ҲӐѬ NBQ\^ந⍞ӊһᱳӁӐᇣᘻ ॢᡔઙӼંѬਜҮӉҮ MFUSBOEPN7BMVFT"SSBZ SBOEPN4FRVFODFQSFGJY 

115.

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

116.

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

117.

主要3プロトコルを眺めてみる まとめ 1. 標準ライブラリの旅 ✓ ✓ ✓ ✓ ✓ 2. CollectionType SequenceType GeneratorType Indexable ForwardIndexType Swift に声をかけてみよう ✓ フォトアルバム ✓ 乱数ジェネレーター