Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
Search
yimajo
January 20, 2020
Technology
520
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
yimajo
January 20, 2020
More Decks by yimajo
See All by yimajo
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
870
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
680
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
380
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
320
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.7k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.7k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.2k
TCA v0.19.0からのSwitchStore/CaseLetが良い
yimajo
0
2k
Other Decks in Technology
See All in Technology
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
110
事業会社における 機械学習・推薦システム技術の活用事例と必要な能力 / ml-recsys-in-layerx-wantedly-2026
yuya4
0
160
コミットの「なぜ」を読む
ota1022
0
120
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
190
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
830
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
540
IaC コードを資産へ:AWS CDK 社内ライブラリと横断展開 / aws-summit-japan-2026
gotok365
10
1.6k
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
160
フィジカル版Github Onshapeの紹介
shiba_8ro
0
320
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
200
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
530
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
150
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
GitHub's CSS Performance
jonrohan
1033
470k
Claude Code のすすめ
schroneko
67
230k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Design in an AI World
tapps
1
250
Prompt Engineering for Job Search
mfonobong
0
350
Navigating Weather and Climate Data
rabernat
0
230
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Product Roadmaps are Hard
iamctodd
PRO
55
12k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
Transcript
ΫϦʔϯΞʔΩςΫνϟͱ J04ΞϓϦ։ൃͷͨΊͷ 7*1&3ͱ J04$MFBO"SDIJUFDUVSFษڧձTQPOTPSFECZ4BOTBO !ZJNBKP
w ΫϦʔϯΞʔΩςΫνϟຊʢҎԼ$"ຊʣࢲʹಡΈͮΒ͍ w ख์͠Ͱྑ͍ຊʂͱݴ͍ͮΒ͍ w ͕ࣗཧղͰ͖͔ͨͲ͏͔ո͍͠ ͡Ίʹ
ΫϦʔϯΞʔΩςΫνϟͰ͏ ʰґଘؔٯసͷݪଇʢ%*1ʣʱ ʹ͍ͭͯͷٙ
ϓϩάϥϛϯάͷجૅͰ͋Δ ʮநʹରͯ͠ϓϩάϥϛϯάͤΑʯͱ͍͏ࣄͱ ʰґଘؔٯసͷݪଇ %*1 ʱ ͱ͍͏ݴ༿ͷҧ͍Կʁ ͓Μͳ͜͡ͱΛΘ͟Θ͟ݪଇʹ͢Δͷʁ
$"ຊΛԿಡ ΜͰͬͱ ٯసΛཧղͰ͖ͨ
࣍ͷਤґଘؔٯసͷݪଇͰ͔͢ DMBTT 3FQPSU(FOFSBUPS DMBTT $PSF%BUB.BOBHFS ίʔυͷݺͼग़͠ QSPUPDPM %BUB(BUFXBZ ४ڌ ͜Ε୯७ʹେੲ͔ΒݴΘΕͯΔ
ʮநʹରͯ͠ϓϩάϥϛϯάͤΑʯΛ ࣮ݱ͍ͯ͠Δ͚ͩͰʁ
ࢲͷײ ͜ͷ୯७ͳநܕͷར༻ςΫχοΫ ʰґଘؔٯసʱ͚ͩͲ ʰґଘؔٯసͷݪଇʱ Ͱͳ͍
ࢲͷײ ʰґଘؔٯసͷݪଇʱݫີʹɺ ෳϞδϡʔϧ͕͋Δ߹ʹɺ Ϟδϡʔϧͷґଘ͕ؔٯస͢Δͱ͖ ͷΈͦΕ͕ద༻͞ΕΔͷͰ
Θ͔Γ͢͞ͷͨΊ J04ΞϓϦ։ൃతʹ &NCFEEFE'SBNFXPSLʹΑΓ Ϟδϡʔϧׂͯ͠ ̎ͭͷϞδϡʔϧͰͷྫΛߟ͑·͢
DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ Ϟδϡʔϧ"Ϟδϡʔϧ#ʹґଘ͍ͯ͠Δɻ Ϟδϡʔϧ"͕#ΛݺͿྫ DMBTT $PSF%BUB.BOBHFS
JNQPSU.PEVMF# DMBTT3FQPSU(FOFSBUPS\ MFUEBUB$PSF%BUBNBOBHFS ʜ ^
DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ Ϟδϡʔϧ"Ϟδϡʔϧ#ʹґଘ͍͕ͯͨ͠ɺϓϩτίϧར༻ʹΑͬͯɺ Ϟδϡʔϧ#͕Ϟδϡʔϧ"ʹґଘ͠͡Ίͨʂʂʜٯసʂʂʂʂ QSPUPDPM %BUB(BUFXBZ
४ڌ Ϟδϡʔϧ#͕"ͷϓϩτίϧʹ४ڌͤ͞Δ DMBTT $PSF%BUB.BOBHFS ͜ͷ߹ͷϓϩτίϧϞδϡʔϧ"ʹॴଐͤ͞ͳ͚Εٯస͠ͳ͍
$"ຊͰ w ͨͩͷநܕͷར༻Λʰґଘؔٯసʱͱ͍ͯ͠Δͷ͕ฆΒΘ͍͠ w $"ຊୈ̑ষʢਤʣ w zιʔείʔυͷґଘؔͱ੍ޚͷํͱٯస w ຊʹϞδϡʔϧͷґଘ͕ؔٯస͢Δ͜ͱ͕ʰґଘؔٯసͷݪ ଇʱͱ͍ͯ͠Δ
w $"ຊୈ̔ষʢਤʣ w z*OUFSBDUPSίϯϙʔωϯτ͔Β%BUBCBTFίϯϙʔωϯτͷ ґଘؔΛٯస
ʰґଘؔٯసͷݪଇʱ ʰґଘؔٯసͷݪଇʱ Ͱͳ͍ *OUFSBDUPSϞδϡʔϧ $POUSPMMFSϞδϡʔϧ %BUBCBTFϞδϡʔϧ
ࣗݾհ w ג ΩϡϦΦγςΟιϑτΣΞ w J04ΞϓϦ։ൃΛੜۀ
ࣗݾհ w BTZODBXBJUݚڀಡຊ w w 3Y4XJGUݚڀಡຊ* ** *** w
w 7*1&3ݚڀಡຊ* w IUUQTTXJGUCPPUIQN
ຊ
ࠓճൃද͍ͨ͜͠ͱ w ͳͥ7*1&3͔ w ΫϦʔϯΞʔΩςΫνϟ $" ͷJ04࣮ύλʔϯͰ͋Δ 7*1&3ͷαϯϓϧίʔυൺֱ w େͷ7*1&3$"ຊʹ͋Δґଘؔٯసͷݪଇ
%*1 Λద ༻͍ͯ͠ͳ͍
ͳͥ7*1&3͔ w 7*1&3ΫϦʔϯΞʔΩςΫνϟ $" ΛJ04ΞϓϦ։ൃʹ෦తʹద༻͠ ͨͷ w 7JFX *OUFSBDUPS 1SFTFOUFS
&OUJUZ 3PVUFSͷύʔπ͝ͱʹΛ ׂ͍ͯ͠Δ 7JFX 3PVUFS 1SFTFOUFS *OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠͷͨΊ࣍ͷը໘ͷ੍ޚΛ୲͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔߦ͍͍͢ɻ ׂ ϏδωεϩδοΫΛ୲͢Δ ׂ σʔλΛΧϓηϧԽ͢Δ ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPSσʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ͑Δɻ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ
7*1&3ͷܥේ ຊՈPCKDJPJTTVFWJQFS ຊՈPCKDJPJTTVFWJQFSTXJGU QFESPIQFSBMUB"SUJDMFTJ047*1&3 KB[[CQO7*1&3%&.0 ΞϯΫϧϘϒʹΑΔΫϦʔϯΞʔΩςΫνϟ ʜ ʜ
ͳ༷ͥʑͳ7*1&3͕ʜ
ຊՈ7*1&3 w w PCKDJPʹدߘ w 50%0ΞϓϦ w $PSF%BUBΛͬͯΔ w
ܕมͷ໋໊͕ΠϚΠν w ΞϓϦىಈ࣌ʹશը໘ͷґଘ ؔΛղܾ
QFESPIQFSBMUB"SUJDMFT J047*1&3 w w $IFFTDBLF-BCT w 344ͷهࣄΛදࣔ w "MBNPpSF3Y4XJGUΛͬͯ
Δ w ܕมͷ໋໊͕ྑ͘ͳͬͨ w 3PVUFS͕ґଘؔΛղܾ
7*1&3αϯϓϧͷڞ௨ w $PSF%BUB3Y4XJGU"MBNPpSFͳͲͷϑϨʔϜϫʔΫʹʰґଘؔ ٯసͷݪଇʱΛద༻͍ͯ͠ͳ͍ w *OUFSBDUPS͕$PSF%BUBʹґଘ w *OUFSBDUPS͕"MBNPpSF3Y4XJGUʹґଘ
%*1ΛΘͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ w $PSF%BUB"MBNPpSFΛΓ ସ͍͑ͨͳΒ w *OUFSBDUPSࣗମΛೖΕସ͑Δ 7JFX 3PVUFS 1SFTFOUFS
*OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠͷͨΊ࣍ͷը໘ͷ੍ޚΛ୲͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔߦ͍͍͢ɻ ׂ ϏδωεϩδοΫΛ୲͢Δ ׂ σʔλΛΧϓηϧԽ͢Δ ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPSσʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ͑Δɻ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ
%*1ΛΘͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ w $PSF%BUB3FBMNͳͲʹґଘ ͠ͳ͍Α͏ʹ w σʔλߏ ʢ.BOBHFE0CKFDU 3FBMN0CKFDUʣΛϓϨʔϯ ͳ4USVDUʹมͯ͠7JFX·
Ͱ͍࣋ͬͯ͘ 7JFX 3PVUFS 1SFTFOUFS %FMFHBUF *OUFSBD ߋ৽Λ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠ ΤϥʔΛ ׂ 7JFX͔ΒͷೖྗΛड৴͠ *OUFSBDUPSσʔλΛཁ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ ٭͜Εಛผ7*1&3తͳղܾํ๏ͱ͍͏Θ͚Ͱ͋Γ·ͤΜ
͜͜·Ͱͷ7*1&3·ͱΊ w ͳΜͰ͜Μͳ৭ʑͳ7*1&3͋Δͷʁ w ݫີʹ$"ʹԊ͓ͬͯΒͣϑϨʔϜϫʔΫґଘ͕͋Δ w ຊՈͷܕ໊ม໊ͷϨΨγʔײ w ݫີʹ$"ʹԊͬͯͳ͍͜ͱͷσϝϦοτʁ w
ׂͱղܾͰ͖Δ w ͦͦ%#௨৴ϥΠϒϥϦΛஔ͖͑Δ͜ͱͬͯ͋Δ ͷ͔ʁͱ͍͏ׂΓΓʜ
ࢀߟʹͳΔ 7*1&3࣮ʁ
7*1&3ݚڀಡຊ w ͜ͷຊͳΓͷ7*1&3αϯϓϧ࡞ w νʔϜͰͬͯ͘ͷʹ͓͢͢Ί ͳ6TF$BTFϓϩτίϧ w ςετίʔυͷར༻Օॴ
6TF$BTF protocol UseCase where Failure: Error { associatedtype Parameters //
Ҿͷܕ associatedtype Success // ޭͨ͠ࡍͷܕ associatedtype Failure // ࣦഊ࣌ͷErrorNeverʹͰ͖ΔΑ͏ʹ func execute(_ parameters: Parameters, completion: ((Result<Success, Failure>) -> ())?) func cancel() } 7*1&3Λ͍ͨ͘ͳΔཁٻͬͯɺܕʹቕΊΒΕ੍ͨͷͱͰ νʔϜͰϒϨͳ͘ϓϩάϥϛϯά͕͍ͨ͠Μ͡Όͳ͍ͷ͔ͳͱ
1SFTFOUFSΛςετ͍ͨ͠ͳΒ 5FTU%PVCMF 7JFX 5FTU%PVCMF 3PVUFS 1SFTFOUFS 5FTU%PVCMF *OUFSBDUPS &OUJUZ ςετ༻ͷσʔλ
͘͠ςετ༻ΤϥʔΛग़ྗ͢Δ ༻ҙͨ͠ςετσʔλΛηοτ͠ɺ ৗʹͦΕΛग़ྗ͢Δɻ 1SFTFOUFSͷΤϥʔϋϯυϦϯάΛ ςετ͚ͨ͠Εɺ ΤϥʔΛฦͤΔผͷ5FTU%PVCMF ༻ҙ͢Δɻ 1SFTFOUFSͷग़ྗͱͯ͠7JFXͷEFMFHBUFϝιου͕ಈ࡞ɻ ͦͷϝιου͔ΒظͱΛൺֱ͢Δ ظͱͷൺֱݕূՕॴ ςετίʔυ͔Βͷݺͼग़͠ 1SFTFOUFSͷग़ྗͱͯ͠3PVUFSʹσʔλ͕͞ΕΔ ͦͷϝιου͔ΒظͱΛൺֱ͢Δ
ॲཧܦ࿏Λ௵ͨ͢Ίʹ ςετίʔυόϦΤʔγϣϯΛ૿͢
༨ஊ w ΫϦʔϯΞʔΩςΫνϟͰநͰͳ͘۩Λ͍ͬͯ Δྫ͋Δʢ$"ຊୈষʣ w 4USJOH҆ఆͨ͠۩ͳͷͰґଘ͍͍ͯ͠ w 4USJOH͕ίϩίϩมΘΔ͜ͱؾʹ͠ͳ͍͍ͯ͘ w ґଘͨ͘͠ͳ͍ͷมԽ͍͢͠۩ཁૉ
ͨ·ʹϝδϟʔόʔδϣϯͰ༷มΘͬͨΓ͢Δ3Y4XJGUΛ શϨΠϠʔͰͬͯͦΕʹґଘ͢ΔͷΫϦʔϯΞʔΩςΫνϟతͰͳ͍͚Ͳ ͦΕ֮ޛ͕͋ͬͯΔΜͳΒྑ͍ͱࢥ͍·͢