Slide 1

Slide 1 text

Dependency Injection in Swift Potatotips-27, March 16, 2016 @yoichitgy - Yoichi Tagaya

Slide 2

Slide 2 text

DI Container for Swift https://github.com/Swinject/Swinject Swinject

Slide 3

Slide 3 text

try! Swift Conference Day 3 http://niwatako.hatenablog.jp/entry/2016/03/04/182144 http://niwatako.hatenablog.jp/entry/2016/03/04/130940 Veronica Ray Ash Furrow Good to use DI Why Use Dependency Injection (DI) - Easy customization - Clear ownership - Testability http://www.tryswiftconf.com “ “

Slide 4

Slide 4 text

Dependency Injection is... https://en.wikipedia.org/wiki/Dependency_injection Pattern implementing inversion of control for resolving dependencies. Wikipedia:

Slide 5

Slide 5 text

Inversion of Control • I'm talking to you.
 / You're talking to me. • You call libraries.
 / Frameworks call you. • You create what you use.
 / What you use are created (and passed).

Slide 6

Slide 6 text

Problem of Dependency Injection /FUXPSL $MBTT" Dependency Beginning... let a = A(network: Network()) Dependency Injection

Slide 7

Slide 7 text

Problem of Dependency Injection /FUXPSL $MBTT" 4FOTPS -PDBUJPO 4USVDU# $MBTT$ Dependency Soon later...

Slide 8

Slide 8 text

Problem of Dependency Injection Much later... /FUXPSL $MBTT" 4FOTPS -PDBUJPO 4USVDU# $MBTT$ Dependency 4USVDU& $MBTT% $MBTT' $MBTT( $MBTT) $MBTT* Hard to manage

Slide 9

Slide 9 text

Solution: DI Container Dependency graph %*$POUBJOFS Register the graph Resolve when you need *OTUBODFPG $MBTT( /FUXPSL $MBTT" 4FOTPS -PDBUJPO 4USVDU# $MBTT$ 4USVDU& $MBTT% $MBTT' $MBTT( $MBTT) $MBTT*

Slide 10

Slide 10 text

Usage of Swinject - DI Container protocol XType { } struct X: XType { } protocol YType { } class Y: YType { let x: XType init(x: XType) { self.x = x } } protocol ZType { } class Z: ZType { let y: YType init(y: YType) { self.y = y } } import Swinject let container = Container() container.register(XType.self) { _ in X() } container.register(YType.self) { r in Y(x: r.resolve(XType.self)!) } container.register(ZType.self) { r in Z(y: r.resolve(YType.self)!) } Registration: Resolution: let z = container.resolve(ZType)! Type definition: Y→X Z→Y X Automatically resolved: Z→Y→X X Y Z

Slide 11

Slide 11 text

Summary • Dependency Injection is good for mocking and testing. • DI container is useful for dependency management. • Swinject is a DI container framework for Swift.

Slide 12

Slide 12 text

Further Readings • Dependency Injection Framework for Swift - Swinjectͷ঺հ
 http://qiita.com/yoichitgy/items/ed8aac4d6f1e6666a4aa • Dependency Injection in Swift (Tokyo iOS Meetup)
 https://speakerdeck.com/yoichitgy/dependency-injection-in-swift • Unit Testing in Swift: Dependency Injection
 https://www.natashatherobot.com/unit-testing-swift-dependency-injection/ • DI in Scala: Cake Pattern pros & cons
 http://www.warski.org/blog/2011/04/di-in-scala-cake-pattern-pros-cons/ • You Used To Inject Me In Your Constructor (Reader Monad)
 https://speakerdeck.com/mathonsunday/you-used-to-inject-me-in-your-constructor