Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
Search
yimajo
January 20, 2020
Technology
540
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
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
380
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
930
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
750
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
410
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
350
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.9k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.8k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.3k
Other Decks in Technology
See All in Technology
AWS FinOps Agent 結局何が得意なの?
siromi
0
230
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
310
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
1
150
GitHub Agentic Workflows を触ってみる
htkym
2
910
IR Today: Theory, Practice, and Agents
dtunkelang
0
310
1万名の社員が使う認証基盤で どう信頼性を担保するか?
kairim0
0
150
Meet AgentCore Identity Consent Portal
hironobuiga
3
150
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
370
[2026 Oracle Technical Deep Dive] AI時代のデータベース基盤をどう選ぶ? Exadata Database Serviceの選択肢と使い分け (2026年9月17日開催)
oracle4engineer
PRO
0
140
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
290
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
2.6k
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
650
Featured
See All Featured
Google's AI Overviews - The New Search
badams
0
1.6k
A Tale of Four Properties
chriscoyier
163
24k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
4 Signs Your Business is Dying
shpigford
187
23k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
The Language of Interfaces
destraynor
162
27k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
First, design no harm
axbom
PRO
2
1.3k
A designer walks into a library…
pauljervisheath
211
25k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
550
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Λ શϨΠϠʔͰͬͯͦΕʹґଘ͢ΔͷΫϦʔϯΞʔΩςΫνϟతͰͳ͍͚Ͳ ͦΕ֮ޛ͕͋ͬͯΔΜͳΒྑ͍ͱࢥ͍·͢