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
Lightweight Dependency Injection tips
Search
Motoki Narita
May 26, 2017
Technology
3.3k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Lightweight Dependency Injection tips
https://potatotips.connpass.com/event/55019/
Motoki Narita
May 26, 2017
More Decks by Motoki Narita
See All by Motoki Narita
Mercari 10years iOS Development
motokiee
5
4.8k
Alexa, Swiftで スマートスピーカーは実装できる?
motokiee
0
2k
iOSの自動化と仕組み化 ~コードと設計に集中する~
motokiee
11
3.1k
入力を型で表現する
motokiee
2
4k
Move Fast iOS Development
motokiee
4
4k
結婚式を支えた技術 Firebaseを活用したサーバレスiOSアプリケーション開発
motokiee
33
26k
Vision Framework 入門
motokiee
2
2k
Hello React Native
motokiee
8
640
RxSwift in Practice
motokiee
11
6.1k
Other Decks in Technology
See All in Technology
ポストモーテム! DDoSからサイトは守れた。 でもビジネスは守れなかった。
bengo4com
0
130
ZOZOTOWNの進化と信頼性を両立する負荷試験
zozotech
PRO
0
110
AIに「使われる」時代のSaaS戦略 〜既存WebAPIのMCPサーバー化における開発ノウハウ〜
ekispert_api
0
290
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
8k
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
300
最近評価が難しくなった
maroon8021
0
240
AWS Blocks を触ってみた/first-tach-aws-blocks
fossamagna
2
140
はじめてのWDM
miyukichi_ospf
1
120
組織における AI-DLC 実践
askul
0
310
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
1
990
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
150
デジタル・デザイン構想 by Sayaka Ishizuka
y150saya
0
190
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
210
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
640
Embracing the Ebb and Flow
colly
88
5.1k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
180
How to Think Like a Performance Engineer
csswizardry
28
2.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Music & Morning Musume
bryan
47
7.3k
Odyssey Design
rkendrick25
PRO
2
720
The Invisible Side of Design
smashingmag
301
52k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
How STYLIGHT went responsive
nonsquared
100
6.2k
sira's awesome portfolio website redesign presentation
elsirapls
0
290
Transcript
-JHIUXFJHIU%FQFOEFODZ*OKFDUJPOUJQT !NPUPLJFF QPUBUPUJQT
ࣗݾհ w !NPUPLJFF w J04ΤϯδχΞ w ϝϧΧϦικॴଐ w ϝϧΧϦΧϧνʔϜ w
J04%$+BQBOελοϑ
lϝϧΧϦΧϧzϦϦʔε
None
None
ϦϦʔε͔Β݄
w ؤுͬͨߕ൹͋ͬͯɺͷϦϦʔεޙؒɺ ΞϓϦ͔ͳΓ҆ఆ͍ͯ͠Δ
w ͍Ζ͍ΖͳऔΓΈ͕ޭΛ͍ͯ͠Δ͕ɺͦͷ͏ͪ ͷҰ͕ͭ%FQFOEFODZ*OKFDUJPO w 88%$ͷ*NQSPWJOH&YJTUJOH"QQTXJUI.PEFSO #FTU1SBDUJDFTͱ͍͏ηογϣϯͰ%*ʹ͍ͭͯऔ Γ্͛ΒΕ͍ͯͯ"QQMF͕ϕετϓϥΫςΟεΛ հ͍ͯ͠Δ 2JJUBʹ·ͱΊ͍ͯ·͢
IUUQRJJUBDPNNPUPLJFFJUFNTEBEFFD
*NQSPWJOH&YJTUJOH"QQTXJUI.PEFSO#FTU1SBDUJDFT88%$ IUUQEFWTUSFBNJOHBQQMFDPNWJEFPTXXEDSSUZNHDZZUIWX @JNQSPWJOH@FYJTUJOH@BQQT@XJUI@NPEFSO@CFTU@QSBDUJDFTQEG
*NQSPWJOH&YJTUJOH"QQTXJUI.PEFSO#FTU1SBDUJDFT88%$ IUUQEFWTUSFBNJOHBQQMFDPNWJEFPTXXEDSSUZNHDZZUIWX @JNQSPWJOH@FYJTUJOH@BQQT@XJUI@NPEFSO@CFTU@QSBDUJDFTQEG
͜͜Ͱհ͞Ε͍ͯΔํ๏ͷΑ͘ͳ͍ͱ͜Ζ w 4FHVFͰભҠΛߦ͏߹ɺ֤ॴͰґଘΦϒδΣΫτ Λ͢ඞཁ͕͋Δ w %3:ʹͳΓʹ͍͘ w ඞཁͳΦϒδΣΫτΛ͞ͳͯ͘ίϯύΠϥ͕ ΤϥʔΛग़ͯ͘͠Εͳ͍ w
ˠҙਤ͠ͳ͍༻్ͰΘΕͨ߹ʹɺͰ͖ΔݶΓ ίϯύΠϥΤϥʔΛग़͢ίʔυΛॻ͖͍ͨ
͜͜Ͱհ͞Ε͍ͯΔํ๏ͷΑ͘ͳ͍ͱ͜Ζ w 4FHVFͰભҠΛߦ͏߹ɺ֤ॴͰґଘΦϒδΣΫτ Λ͢ඞཁ͕͋Δ w %3:ʹͳΓʹ͍͘ w ඞཁͳΦϒδΣΫτΛ͞ͳͯ͘ίϯύΠϥ͕ ΤϥʔΛग़ͯ͘͠Εͳ͍ w
ˠҙਤ͠ͳ͍༻్ͰΘΕͨ߹ʹɺͰ͖ΔݶΓ ίϯύΠϥΤϥʔΛग़͢ίʔυΛॻ͖͍ͨ
r!@JTILBXB lྑ͍ઃܭޡͬͨ༻๏ΛίϯύΠϧΤϥʔʹ͢Δz
ϝϧΧϦΧϧͰͷϧʔϧ w %*ͳ7JFX$POUSPMMFSΛఆٛͯ͠ɺ7JFX$POUSPMMFSͷ ΠϯελϯεԽίʔυͰߦ͏ w ը໘ͷϨΠΞτ4UPSZCPBSEͰఆٛ͠ɺΠϯε λϯεԽͱભҠΛίʔυͰॻ͘
ܦҢ w ϝϧΧϦΞοςͷ։ൃΛଓ͚ΔதͰɺʮ4FHVFΛΊΑ ͏ʯͱ͍͏ྲྀΕ͕Ͱ͖ͨ w ίʔυΛॻ͖ଓ͚͍ͯ͘தͰݟ͚ͭͨ w ϝϧΧϦΞοςͰը໘ͷભҠʹ4FHVFΛ͍ͬͯͨ w ެ։ͨ͘͠ͳ͍ϓϩύςΟΛެ։͢Δඞཁ͕͋ͬͨ
w ػೳ͕૿͍͑ͯ͘ͱͱʹԿΛઃఆ͠ͳ͚Ε͍͚ͳ ͍ͷ͔͕͔Βͳ͘ͳΓෳࡶʹͳ͍ͬͯͬͨ
%FQFOEFODZ*OKFDUBCMFQSPUPDPM
͍͜͠ͱ͍ͯ͠ͳͯ͘ɺ ͜Ε͚ͩ
protocol DependencyInjectable { associatedtype Dependency static func make(withDependency dependency: Dependency)
-> Self }
͍ํ %FQFOEFODZ*OKFDUBCMFͳ7JFX$POUSPMMFSͷఆٛํ๏
final class WebViewController: UIViewController, DependencyInjectable { private var url: URL!
typealias Dependency = URL static func make(withDependency dependency: Dependency) -> WebViewController { let vc = WebViewController.instantiateInitialViewController(with: "WebViewController") vc.url = dependency return vc } } ґଘ͢ΔΦϒδΣΫτͷఆٛ
final class WebViewController: UIViewController, DependencyInjectable { private var url: URL!
typealias Dependency = URL static func make(withDependency dependency: Dependency) -> WebViewController { let vc = WebViewController.instantiateInitialViewController(with: "WebViewController") vc.url = dependency return vc } } %*ͳ7JFX$POUSPMMFSͷΠϯελϯεɺ NBLFϝιουͰੜ͢Δ
4FHVFͷ߹
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { switch segue.destination
{ case let vc as WebViewController: vc.url = url default: break } } VSMΛ֎෦ʹެ։͢Δඞཁ͕͋Δ ͜ͷ7JFX$POUSPMMFSΛݺͼग़͢ॴ͕૿͑ͨ߹ɺͦͷ͜ͷίʔυΛ ॻ͘ඞཁ͕͋Δ
final class WebViewController: UIViewController, DependencyInjectable { private var url: URL!
typealias Dependency = URL static func make(withDependency dependency: Dependency) -> WebViewController { let vc = WebViewController.instantiateInitialViewController(with: "WebViewController") vc.url = dependency return vc } } VSMΛQSJWBUFʹͰ͖Δ ΠϯελϯεԽͷํ๏͕౷Ұ͞Ε͍ͯΔ͜ͱͰ%3:ݪଇΛकΕΔ
final class WebViewController: UIViewController, DependencyInjectable { private var url: URL!
typealias Dependency = URL static func make(withDependency dependency: Dependency) -> WebViewController { let vc = WebViewController.instantiateInitialViewController(with: "WebViewController") vc.url = dependency return vc } } ͜Ε͚ͩݟΔͱ4FHVFͷํ͕ศརʹݟ͑Δ͕ɺͬͱෳࡶͳґଘੑ Λೖ͢Δඞཁ͕Ͱ͖ͨ߹ʹɺ4FHVFΛͬͨํ͔ࣜͳΓ໘ ͳ͜ͱʹͳΔ
final class WebViewController: UIViewController, DependencyInjectable { private var url: URL!
private var customUserAgent: String? struct Dependency { let url: URL let customUserAgent: String? } static func make(withDependency dependency: Dependency) -> WebViewController { let vc = WebViewController.instantiateInitialViewController(with: "WebViewController") vc.url = dependency.url vc.customUserAgent = dependency.customUserAgent return vc } } ྫͱͯ͠ɺ8FC7JFXʹઃఆ͢ΔDVTUPN6TF"HFOUΛมߋ͢Δඞཁ ͕͋Δ߹ɺ͜ͷΑ͏ʹ%FQFOEFODZTUSVDUΛఆٛͰ͖ɺNBLFϝ ιουͰ݁ͤ͞Δ͜ͱ͕Ͱ͖Δ
͍ํ %FQFOEFODZ*OKFDUBCMFͳ7JFX$POUSPMMFSͷ͍ํ
let vc = WebViewController.make(withDependency: url) navigationController?.pushViewController(vc, animated: true)
let vc = WebViewController.make(withDependency: url) navigationController?.pushViewController(vc, animated: true)
ຖճNBLF͢Δͷ͕໘ ભҠ΄ͱΜͲͷέʔεͰQVTI͔NPEBM ˠநԽ͍ͨ͠
extension UIViewController { func present<DI: DependencyInjectable>(viewControllerType: DI.Type, dependency: DI.Dependency, withNavigationType
navigationType: UINavigationController.Type? = nil, animated: Bool = true, completion: (() -> Swift.Void)? = nil) where DI: UIViewController { let vc = viewControllerType.make(withDependency: dependency) if let navigationType = navigationType { let nav = navigationType.init(rootViewController: vc) present(nav, animated: animated, completion: completion) } else { present(vc, animated: animated, completion: completion) } } func push<DI: DependencyInjectable>(viewControllerType: DI.Type, dependency: DI.Dependency, animated: Bool = true) where DI: UIViewController { let vc = viewControllerType.make(withDependency: dependency) navigationController?.pushViewController(vc, animated: animated) } } %FQFOEFODZ*OKFDUBCMFΛͬͯભҠ࣌ͷίʔυΛநԽ
push(viewControllerType: WebViewController.self, dependency: url) present(viewControllerType: WebViewController.self, dependency: url, withNavigationType: CustomNavigationController.self)
%FQFOEFODZ*OKFDUBCMFϓϩτίϧͷநԽͷ͓ӄͰɺ ͜Μͳײ͡Ͱָʹॻ͚ΔΑ͏ʹͳͬͨʂ
push(viewControllerType: WebViewController.self, dependency: url) present(viewControllerType: WebViewController.self, dependency: url, withNavigationType: CustomNavigationController.self)
͍͖ͳΓ͜͜ʹͨͲΓண͍ͨΘ͚Ͱͳ͘ɺϦϑΝΫλϦϯάΛ ܁Γฦ͍ͯ͘͠தͰ͍·ͷܗʹͳ͍ͬͯͬͨ
·ͱΊ
ྑ͍ͱ͜Ζ w ΠϯελϯεԽͷํ๏͕౷Ұ͞ΕΔ w ౷Ұ͞ΕΔ͜ͱʹΑͬͯ%3:ʹ w ࠶ར༻ָ͕ʹͳͬͨ w ґଘੑ͕ͳ͍6*7JFX$POUSPMMFSͰ %FQFOEFODZ*OKFDUBCMFʹ͓ͯ͘͜͠ͱʹΑͬ
ͯɺޙ͔Βґଘੑ͕Ճ͞Εͨͱ͖ʹαΫοͱର Ԡ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨ
͋Μ·ྑ͘ͳ͍ͱ͜Ζ w 4UPSZCPBSEͷ4FHVFΛΘͳ͍ͱ͍͏બΛͨ͠ͷͰɺ 4UPSZCPBSEͰը໘ؒͷભҠ͕ѲͰ͖ͳ͘ͳͬͨ w ˠ$PPSEJOBUPSΫϥεͷΑ͏ͳͷΛՃ͢Δ͜ͱͰ 4UPSZCPBSE্ͰΘ͔Βͳͯ͘ίʔυͰՄಡͳঢ়ଶʹ͍ͨ͠ w ݱঢ়ɺ4UPSZCPBSE͔ΒΠϯελϯεԽ͍ͯ͠Δ෦4UPSZCPBSE Ϋϥε໊͕มߋ͞Εͨͱ͖ʹյΕΔ
w NBLFͰΠϯελϯεੜͰ͖Δ͔ͷςετΛॻ͘͜ͱͰ࠷ ݶͷΧόʔΛࢦ͢
͓ΘΓ