130 Views
April 24, 16
スライド概要
2016/04/24 の Swift 愛好会で発表した『Swift 標準プロトコルを旅して Swift と楽しく会話してみよう!』という趣旨のお話です。2017/03/22 に内容を Swift 3 対応しました。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 6,824 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
Swift カジュアルプログラミング 主要3プロトコルを眺めてみる 2016.04.24 集まれ Swift 好き!Swift 愛好会 #6 EZ-NET 熊⾕友宏 Swift 2.2 http://ez-net.jp/
熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ 書籍 / 登壇 Xcode 5 徹底解説 MOSA Xcode 5 の全機能を 徹底的に解説した本 OSX/iOS 系の歴史深い 有料会員制の勉強会 Xcode 7 でも役⽴つはず 法人会員も多数 紙版は絶版、電⼦書籍は販売中 2016-05-13 初⼼者向けセミナーで登壇
熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ 勉強会 横浜 iPhone 開発者勉強会 カジュアル Swift 勉強会 【 横浜・⾺⾞道 】 #yidev 【 横浜・⻘葉台 】 #cswift わいわい・ゆるく、iPhone 開発者の みんなで楽しく過ごすのが⽬的の会 ゆるくみんなで Swift を語らえる場を 作りたくて始めた会 第23回を 2016-05-07 に開催予定
熊⾕友宏 @es_kumagai EZ-NET http://ez-net.jp/ iOS, OS X, Apple Watch アプリ CodePiece いつもの電卓 ソースコードを Twitter と Gist に同時投稿できる。 計算式も⾒える電卓アプリ。 watchOS 1 対応 ⾳で再配達ゴッド EZ-NET IP Phone 簡単操作で 再配達の申し込み。 iPhone でひかり電話を使う。 ⾃宅 LAN からの利⽤専⽤
CodePiece for OS X 勉強会を楽しむアプリ ソースコードを Twitter と Gist に同時投稿できる 勉強会で知⾒をみんなと共有したい時とかに便利! できること #love_swift
前回
プロトコル 繪⾯さんが⾒せてくれたこと ▶ 存在の感じ⽅ ▶ 観察のしかた ▶ 読み進め⽅
プロトコルを知ると Swift の気持ちが⾒えてくる
Swift の声をもっと聴きたい
今回
プロトコルを実際に巡って Swift の⼼に触れてみる
その前に…
プロトコル指向に想う世界観 どうやら誤解を招いた様⼦
プロトコル指向に想う世界観 おそらく誤解を招いた部分
プロトコル指向に想う世界観 明確に分離したいのは 世界観 人間界 霊界 明確に分離 精神世界 物質世界 人間 型 プロトコル (インスタンス) 見える 見えない ※ 世界の交わりの観点なら
閑話休題
標準ライブラリの旅 主要3プロトコル 編
主要3プロトコル 気づかずに多⽤してるプロトコルたち ▶ CollectionType ▶ SequenceType ▶ GeneratorType
たとえば、配列
配列ってこんな感じ Array<Element> ӲҹҬӵᥨҷᢅ MFUWBMVFT< > ञӒൺӂᖌӘఌӘᥨҷᢅ MFUWBMVFT<*OU>< > MFUWBMVFT"SSBZ*OU< > ㌔ఇӘᮿ⥎ҶਜҲӵ WBMVFTDPVOU WBMVFTTPSU
配列って 他にどんな機能があるんだろう
配列の定義をたどる Jump To Definition MFUWBMVFT"SSBZ*OU< > Shortcut ⌃ ⌘ J
配列の定義 これまでの定義の⾒⽅ こんな機能を 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
配列の定義 新しい定義の⾒⽅ 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
プロトコルが 型に性質を与える
Array<Element>: CollectionType CollectionType が 配列らしさの根底にある
掘り下げてみよう
プロトコル観察(1) CollectionType
その前に 想像してみてください
配列の特徴を想像 ▶ 複数の要素を内包する ▶ 添字を使って要素を取り出せる ▶ 部分配列を切り出せる
CollectionType の印象を想像 ▶ 直訳すると、集約型 ▶ 複数の要素を集めていそう
想像が 理解の⼤事な助けになる
想像を以って CollectionType を観察
CollectionType 観察 定義を辿る $PMMFDUJPO5ZQF Shortcut ⌃ ⌘ J
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^ ^
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^ ^ 添字で参照 配列の切り出し 内容を扱う
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^ 部分配列っぽい ^ 配列の切り出し
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^ ^
CollectionType 観察 まだ判らないプロトコル これなら 解りそうかも ▶ Indexable 索引付け可能? ▶ SequenceType 連続型? ▶ GeneratorType ⽣成器型?
標準ライブラリの旅 ここまでの まとめ
標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 増えた!
プロトコル観察(2) Indexable
Indexable の印象を想像 ▶ 直訳すると、索引付け可能 ▶ 索引で何かを扱えそう
Indexable 観察 定義を辿る *OEFYBCMF Shortcut ⌃ ⌘ J
Indexable 観察 定義を眺める また新しい プロトコル QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ これはなに…? 索引の範囲表現
Indexable 観察 調べやすそうなところに注⽬ QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ これはなに…? 全く⼿がかりを 読み取れない … そういう時は 想像で OK !
Indexable 観察 再び定義を眺める QSPUPDPM*OEFYBCMF\ 残るのは この1つだけ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ とりあえず 索引型?
Indexable が だいたいわかった
Indexable まとめ ⺙ᙟӘ⚳ QSPUPDPM*OEFYBCMF\ BTTPDJBUFEUZQF*OEFY'PSXBSE*OEFY5ZQF WBSTUBSU*OEFY*OEFY\HFU^ WBSFOE*OEFY*OEFY\HFU^ TVCTDSJQU QPTJUJPO*OEFY @&MFNFOU\HFU^ ^ ▶ 索引の範囲を取得できる ▶ 添字で索引を添えてアクセスできる
Indexable 世界観 索引の範囲を取得でき、 添字で要素を参照 できる性質 なにか startIndex endIndex 㔸ᄇ৴⡕ ✳▧৴⡕ ᷵ᆻӑ✝ᐠӼ᷵ҲӐ⺙✛Ӽീ῍
標準ライブラリの旅 ここまでの まとめ
標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 増えた!
プロトコル観察(3) ForwardIndexType
ForwardIndexType の印象を想像 ▶ 直訳すると、索引型 (IndexType) ▶ 前⽅に進んでいけそう
ForwardIndexType 観察 定義を辿る 'PSXBSE*OEFY5ZQF Shortcut ⌃ ⌘ J
ForwardIndexType 観察 定義を眺める 内部⽤っぽいので 無視したいけど無理… QSPUPDPM'PSXBSE*OEFY5ZQF@*ODSFNFOUBCMF\ BTTPDJBUFEUZQF%JTUBODF@4JHOFE*OUFHFS5ZQF*OU GVODBEWBODFE#Z O%JTUBODF 4FMG GVODBEWBODFE#Z O%JTUBODF MJNJU4FMG 4FMG GVODEJTUBODF5P FOE4FMG %JTUBODF ^ 新登場だけど たぶん符号付き整数 前⽅へ 指定した距離 進む 他の索引との 距離を得る
ForwardIndexType 観察 しかたないので 定義を眺める 察するに… “増加可能” な性質 QSPUPDPM@*ODSFNFOUBCMF&RVBUBCMF\ GVODTVDDFTTPS ^ 4FMG 後続 (successor) を 取得するもの 察するに… “⽐較可能” な性質 QSPUPDPM&RVBUBCMF\ GVOD MIT4FMG SIT4FMG #PPM ^ 同⼀性を判定
ForwardIndexType が だいたいわかった
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 ▶ 前⽅へ進める索引型 ▶ 任意の距離を指定して進める ▶ 索引型は⽐較可能
ForwardIndexType 世界観 先へ先へと辿れる、 索引を表現する 型の性質 ᰪӘ✝ᐠӼᒉ 索引 A successor distanceTo 索引 B 㮬ӎӘ✝ᐠ㔿Әヮ㘊 advancedBy Ꮇӎҵ୩Ә✝ᐠӼᒉ 索引 C ◠Ღ㆜ 索引 D
標準ライブラリの旅 ここまでの まとめ
標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 未調査 ▶ GeneratorType 未調査 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
プロトコル観察(4) SequenceType
SequenceType の印象を想像 ▶ 直訳すると、連続型 ▶ 連続した値を扱えそう
SequenceType 観察 定義を辿る 4FRVFODF5ZQF Shortcut ⌃ ⌘ J
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> ^
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> ^
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> ^
プロトコル観察(5) GeneratorType
GeneratorType の印象を想像 ▶ 直訳すると、⽣成器型 ▶ 何かを⽣成できそう
GeneratorType 観察 定義を辿る (FOFSBUPS5ZQF Shortcut ⌃ ⌘ J
GeneratorType 観察 定義を眺める QSPUPDPM(FOFSBUPS5ZQF\ BTTPDJBUFEUZQF&MFNFOU NVUBUJOHGVODOFYU ^ &MFNFOU 次の値を⽣み出す
GeneratorType が だいたいわかった
GeneratorType まとめ ⺙ᙟӘ⚳ QSPUPDPM(FOFSBUPS5ZQF\ BTTPDJBUFEUZQF&MFNFOU NVUBUJOHGVODOFYU ^ &MFNFOU ▶ 次の要素を⽣み出せる ▶ ⽣み出せない可能性もある
GeneratorType 世界観 次へ次へと要素を ⽣み出していける 型の性質 ᰪӘ⺙✛Ӽ⇰ᘻ next 要素 生成器 要素 要素
標準ライブラリの旅 ここまでの まとめ
標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 観察中 … ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
プロトコル観察(6) SequenceType
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> ^
SequenceType が だいたいわかった
SequenceType まとめ ⺙ᙟӘ⚳ QSPUPDPM4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF ^ (FOFSBUPS ▶ 連続する要素を扱う型 ▶ 要素を次々に得る概念を持つ ▶ 要素の並び順までは語られてなさそう
標準ライブラリの旅 ここまでの まとめ
標準ライブラリの旅 ここまでの まとめ ▶ CollectionType 観察中 … ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
プロトコル観察(7) CollectionType
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^ ^ この辺りは もう⼤丈夫
CollectionType が だいたいわかった
CollectionType まとめ ⺙ᙟӘ⚳ QSPUPDPM$PMMFDUJPO5ZQF*OEFYBCMF 4FRVFODF5ZQF\ BTTPDJBUFEUZQF(FOFSBUPS(FOFSBUPS5ZQF GVODHFOFSBUF (FOFSBUPS TVCTDSJQU QPTJUJPO*OEFY (FOFSBUPS&MFNFOU\HFU^ ^ ▶ 複数要素を集めて扱う型 ▶ 要素は連続的で、索引で取り扱える性質を持つ ▶ 要素を次々に得る概念を持つ
標準ライブラリの旅 達成
標準ライブラリの旅 達成 ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
プロトコルの性質を知って活かすと Swift がもっと楽しくなる!
Swift に声をかけてみよう Swift の気持ちになって接する
フォトアルバム
フォトアルバム 要件 ▶ ひとつのデータ構造で表現する ▶ 複数枚の写真を収録する ▶ アルバムには表題を設定できる ▶ アルバム内の写真を⾃由に⾒られる
フォトアルバム 実装 ӜӒӎӘԯդԧ᭜㉏ӑⷭ⅁Ӄӵ TUSVDU1IPUP"MCVN\ ⹋ᡔ᧞Әந⍞Ӽൊ㑤Ӄӵ WBSQIPUPT"SSBZ1IPUP ԊՓԸՈӕәⷭ㛸Ӽ⼀ᇰӑҷӵ WBSUJUMF4USJOH ԊՓԸՈӘந⍞Ӽ⧞∀ӕ⺠ӳӶӵ TVCTDSJQU JOEFY*OU 1IPUP\ SFUVSOQIPUPT<QIPUPTTUBSU*OEFYBEWBODFE#Z JOEFY > ^ ^
ここで Swift の気持ちに寄り添う
フォトアルバム の性質 複数の写真を持ち、自由に眺められる
標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
フォトアルバムに CollectionType を適⽤
プロトコルの適⽤⽅法 勘所 ▶ プロトコルが持つ性質を 実現するための振る舞いを実装する ↑ その性質を持つことを約束するために必須 ▶ 性質から⾃然と導かれる振る舞いは 普通は実装しなくて良い ↑ 性質に基づいて既に規定されてる 具体的には … プロトコルで規定されている概念のうち、 extension で実装されていないものを実装していく
CollectionType の適⽤⽅法 性質を実現するために必要な機能 ▶ var startIndex: Index { get } 最初の要素が存在する位置を⽰す索引を取得 ▶ var endIndex: Index { get } 最後の要素の次の位置を⽰す索引を取得 ▶ subscript (position: Index) ->Element { get } 指定した位置にある要素を取得
フォトアルバム CollectionType を適⽤ ӜӒӎӘԯդԧ᭜㉏ӑⷭ⅁Ӄӵ TUSVDU1IPUP"MCVN$PMMFDUJPO5ZQF\ ⹋ᡔ᧞Әந⍞Ӽൊ㑤Ӄӵ WBSQIPUPT"SSBZ1IPUP ԊՓԸՈӕәⷭ㛸Ӽ⼀ᇰӑҷӵ WBSUJUMF4USJOH ԊՓԸՈӘந⍞Ӽ⧞∀ӕ⺠ӳӶӵ TVCTDSJQU JOEFY*OU 1IPUP\ SFUVSOQIPUPT<QIPUPTTUBSU*OEFYBEWBODFE#Z JOEFY > ^ ந⍞Ә㔸ᄇ৴⡕Ӽᒉ WBSTUBSU*OEFY*OU\ SFUVSO ^ ந⍞Әᦎ▧৴⡕Ӽᒉ WBSFOE*OEFY*OU\ SFUVSOQIPUPTDPVOU ^ ^
こんな感じにすると …
フォトアルバム Swift と会話が弾む MFUBMCVN1IPUP"MCVN QIPUPTQIPUPT UJUMF.Z"MCVN ந⍞Әൊ㑤ᡔӼᡉҲӐ㮹 BMCVNDPVOU ᥰఉӘந⍞Ҷ⺠ӉҮ㮛 BMCVNGJSTU 㮭ӎӫӘந⍞ә㮹 BMCVN<> ᧀউӘந⍞ӊһ⺠ӉҮ㮛 BMCVNGJMUFS\MPDBUJPO5PLZP^ ԊՓԸՈӕநӍӐҮӵә㮹 MFUQFSTPOT*O"MCVNBMCVNGMBU.BQ\QFSTPOT^
楽しい!
乱数ジェネレーター
乱数ジェネレーター 要件 ▶ UInt32 の乱数を⽣成する ▶ 次々と乱数を作り出せる
ここで Swift の気持ちに寄り添う
乱数ジェネレーターの 性質 次々と乱数を生成できる型
標準ライブラリの旅 同じ性質のプロトコルを探してみる ▶ CollectionType 連続する複数要素を持ち、索引で扱える型の性質 ▶ SequenceType 連続する複数の要素を扱う型の性質 ▶ GeneratorType 次へ次へと要素を⽣み出していける型の性質 ▶ Indexable 索引の範囲を取得し、添字で要素を参照できる性質 ▶ ForwardIndexType 先へ先へと辿れる索引を表現する型の性質
乱数ジェネレーターを GeneratorType に基づいて実装
GeneratorType の適⽤⽅法 性質を実現するために必要な機能 ▶ mutating func next() -> Element? 次の要素を⽣成
乱数ジェネレーター 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 ^ ^
こんな感じにすると …
乱数ジェネレーター Swift と会話が弾む JNQPSU%BSXJO$ WBSSBOEPN3BOEPN(FOFSBUPS Y Z [ XBSDSBOEPN ᰪӘॢᡔҶᰲӁҮ SBOEPNOFYU ҿӳӕᰪӘॢᡔҶᰲӁҮ SBOEPNOFYU ㉒❰ӃӵॢᡔઙҶᰲӁҮ MFUSBOEPN4FRVFODF"OZ4FRVFODF\SBOEPN^ ԽԑԊՓԸՈӘந⍞ӼԟՋԫԽՓӃӵ㮛 MFUQIPUPT[JQ BMCVN SBOEPN4FRVFODF ந⍞ӒॢᡔӼᦲӗӐѬ TPSU\^ॢᡔӑलӝҲӐѬ NBQ\^ந⍞ӊһᱳӁӐᇣᘻ ॢᡔઙӼંѬਜҮӉҮ MFUSBOEPN7BMVFT"SSBZ SBOEPN4FRVFODFQSFGJY
Swiftと仲良くなれた! かも?
Swift との会話を ぜひ楽しんでみてください
主要3プロトコルを眺めてみる まとめ 1. 標準ライブラリの旅 ✓ ✓ ✓ ✓ ✓ 2. CollectionType SequenceType GeneratorType Indexable ForwardIndexType Swift に声をかけてみよう ✓ フォトアルバム ✓ 乱数ジェネレーター