Turn the pyramid of doom into a line of happiness
Teddy Ku'VODUJPOBMQSPHSBNNJOHGPS6*
View Slide
2Copyright © Merpay, Inc. All Rights Reserved.5FEEZ,V!ULVJDIPPTFZPV!ULVJDIPPTFZPV4UBUVT
3Copyright © Merpay, Inc. All Rights Reserved.'FBUVSF0OCPBSEJOHUVUPSJBMT
4Copyright © Merpay, Inc. All Rights Reserved.'FBUVSF0OCPBSEJOHUVUPSJBMT
50OCPBSEJOHUVUPSJBMTCopyright © Merpay, Inc. All Rights Reserved.
6Copyright © Merpay, Inc. All Rights Reserved.class BalloonView: UIView {var onTapped: (() -> Void)?var contentView: UIViewfunc show() { /* ... */ }func dismiss() { /* ... */ }/* ... */}
7Copyright © Merpay, Inc. All Rights Reserved.class ViewController: UIViewController {func showTutorialFlow() {let tutorialOne = tutorialOneBalloonView()let tutorialTwo = tutorialTwoBalloonView()let tutorialThree = tutorialThreeBalloonView()tutorialOne.onTapped = { [weak tutorialOne] intutorialOne?.dismiss()tutorialTwo.show()}tutorialTwo.onTapped = { [weak tutorialTwo] intutorialTwo?.dismiss()tutorialThree.show()}tutorialThree.onTapped = { [weak self, weak tutorialThree] intutorialThree?.dismiss()self?.hideGrayOverlay { }}showGrayOverlay {tutorialOne.show()}}
8Copyright © Merpay, Inc. All Rights Reserved.class ViewController: UIViewController {func showTutorialFlow() {let tutorialOne = tutorialOneBalloonView()let tutorialTwo = tutorialTwoBalloonView()let tutorialThree = tutorialThreeBalloonView()%PO`UXBOUUPJOTUBOUJBUFFWFSZUIJOHVQGSPOU0OMZOFFEPOFWJFXBUBUJNF
9Copyright © Merpay, Inc. All Rights Reserved.3FXSJUFPOFWJFXBUBUJNF
class ViewController: UIViewController {func showTutorialFlow() {let tutorialOne = tutorialOneBalloonView()tutorialOne.onTapped = { [weak tutorialOne] intutorialOne?.dismiss()let tutorialTwo = tutorialTwoBalloonView()tutorialTwo.onTapped = { [weak tutorialTwo] intutorialTwo?.dismiss()let tutorialThree = tutorialThreeBalloonView()tutorialThree.onTapped = { [weak self, weak tutorialThree] intutorialThree?.dismiss()self?.hideGrayOverlay { }}tutorialThree.show()}tutorialTwo.show()}showGrayOverlay {tutorialOne.show()}}10Copyright © Merpay, Inc. All Rights Reserved.Pyramid of doom
11Copyright © Merpay, Inc. All Rights Reserved./FTUFEDMPTVSFT)PXUPEFBMXJUIUIFN
12Copyright © Merpay, Inc. All Rights Reserved.'VODUJPOTJOGVODUJPOT-FU`TVTFGVODUJPOT'VODUJPOBM1SPHSBNNJOH
13Copyright © Merpay, Inc. All Rights Reserved.5IJOLUPQEPXO8IBUXPVMEUIFJEFBMTPMVUJPOMPPLMJLF
14Copyright © Merpay, Inc. All Rights Reserved.func showTutorialFlow() {let tutorialBalloon = tutorialOneBalloonView()let transitions = tutorialBalloon.onTapped({ inputBalloonView ininputBalloonView?.dismiss()return tutorialTwoBalloonView()}) >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialThreeBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFourBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFiveBalloonView()} >>> { [weak self] inputBalloonView ininputBalloonView?.dismiss()self?.hideGrayOverlay { }return nil}tutorialBalloon.show(onTapped: transitions)}$PNQPTBCMFUSBOTJUJPOGVODUJPOT
15Copyright © Merpay, Inc. All Rights Reserved.)PXXPVMEXFJNQMFNFOUUIJT
16Copyright © Merpay, Inc. All Rights Reserved.typealias BalloonTransition = (BalloonView?) -> BalloonView?// associativity: rightinfix operator >>>: FunctionArrowPrecedencefunc >>> ( transitionOne: @escaping BalloonTransition, transitionTwo: @escaping BalloonTransition) -> BalloonTransition {return { balloonView inballoonView?._nextTransition = transitionTworeturn transitionOne(balloonView)}}1 >>> (2 >>> (3 >>> (4 >>> 5)))
17Copyright © Merpay, Inc. All Rights Reserved.func >>> ( transitionOne: @escaping BalloonTransition, transitionTwo: @escaping BalloonTransition) -> BalloonTransition {return { balloonView inballoonView?._nextTransition = transitionTworeturn transitionOne(balloonView)}}1 >>> (2 >>> (3 >>> (4 >>> 5)))func showTutorialFlow() {let tutorialBalloon = tutorialOneBalloonView()let transitions = tutorialBalloon.onTapped({ inputBalloonView ininputBalloonView?.dismiss()return tutorialTwoBalloonView()}) >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialThreeBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFourBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFiveBalloonView()} >>> { [weak self] inputBalloonView ininputBalloonView?.dismiss()self?.hideGrayOverlay { }return nil}tutorialBalloon.show(onTapped: transitions)}
18Copyright © Merpay, Inc. All Rights Reserved.func showTutorialFlow() {let tutorialBalloon = tutorialOneBalloonView()let transitions = tutorialBalloon.onTapped({ inputBalloonView ininputBalloonView?.dismiss()return tutorialTwoBalloonView()}) >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialThreeBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFourBalloonView()} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFiveBalloonView()} >>> { [weak self] inputBalloonView ininputBalloonView?.dismiss()self?.hideGrayOverlay { }return nil}tutorialBalloon.show(onTapped: transitions)}func >>> ( transitionOne: @escaping BalloonTransition, transitionTwo: @escaping BalloonTransition) -> BalloonTransition {return { balloonView inballoonView?._nextTransition = transitionTworeturn transitionOne(balloonView)}}} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFiveBalloonView()} >>> { [weak self] inputBalloonView ininputBalloonView?.dismiss()self?.hideGrayOverlay { }return nil}-BTUUXPDMPTVSFT
Copyright © Merpay, Inc. All Rights Reserved.{ balloon4 inballoon4.nextTransition = { [weak self] balloon5 inballoon5?.dismiss()self?.hideGrayOverlay { }return nil}balloon4?.dismiss()return tutorialFiveBalloonView()}} >>> { inputBalloonView ininputBalloonView?.dismiss()return tutorialFiveBalloonView()} >>> { [weak self] inputBalloonView ininputBalloonView?.dismiss()self?.hideGrayOverlay { }return nil}FYFDVUFXIFOCBMMPPOJTUBQQFEFYFDVUFXIFOCBMMPPOJTUBQQFE8IBUEPFTSFUVSOTBDMPTVSF OPUBDUVBMDPEF
Copyright © Merpay, Inc. All Rights Reserved.balloon3.nextTransition = { balloon4 inballoon4.nextTransition = { [weak self] balloon5 inballoon5?.dismiss()self?.hideGrayOverlay { }return nil}balloon4?.dismiss()return tutorialFiveBalloonView()}balloon3?.dismiss()return tutorialFourBalloonView()GVODUJPOXJMMTFUUIFDMPTVSFUPUIFQSFWJPVT#BMMPPO7JFX8IBUEPFT OPUBDUVBMDPEF
Copyright © Merpay, Inc. All Rights Reserved.balloon2.nextTransition = { balloon3 inballoon3.nextTransition = { balloon4 inballoon4.nextTransition = { [weak self] balloon5 inballoon5?.dismiss()self?.hideGrayOverlay { }return nil}balloon4?.dismiss()return tutorialFiveBalloonView()}balloon3?.dismiss()return tutorialFourBalloonView()}balloon2?.dismiss()return tutorialThreeBalloonView()8IBUEPFT OPUBDUVBMDPEF
Copyright © Merpay, Inc. All Rights Reserved.tutorialBalloon.show(onTapped: { balloon1 inballoon1.nextTransition = { balloon2 inballoon2.nextTransition = { balloon3 inballoon3.nextTransition = { balloon4 inballoon4.nextTransition = { [weak self] balloon5 inballoon5?.dismiss()self?.hideGrayOverlay { }return nil}balloon4?.dismiss()return tutorialFiveBalloonView()}balloon3?.dismiss()return tutorialFourBalloonView()}balloon2?.dismiss()return tutorialThreeBalloonView()}balloon1?.dismiss()return tutorialTwoBalloonView()})8IBUEPFT OPUBDUVBMDPEF
Copyright © Merpay, Inc. All Rights Reserved.tutorialBalloon.show(onTapped: { balloon1 inballoon1.nextTransition = { balloon2 inballoon2.nextTransition = { balloon3 inballoon3.nextTransition = { balloon4 inballoon4.nextTransition = { [weak self] balloon5 inballoon5?.dismiss()self?.hideGrayOverlay { }return nil}balloon4?.dismiss()return tutorialFiveBalloonView()}balloon3?.dismiss()return tutorialFourBalloonView()}balloon2?.dismiss()return tutorialThreeBalloonView()}balloon1?.dismiss()return tutorialTwoBalloonView()})
24Copyright © Merpay, Inc. All Rights Reserved..JTTJPOBDDPNQMJTIFE3FBEBCMFDPEF0OMZPOF#BMMPPO7JFXJONFNPSZ
25Copyright © Merpay, Inc. All Rights Reserved.$VSSZJOHfunc add(x: Int) -> ((Int) -> Int) {return { y in return x + y }}// Removed in Swift 3// https://github.com/apple/swift-evolution/blob/master/proposals/0002-remove-currying.mdfunc foo(x: Int)(y: Int)
26Copyright © Merpay, Inc. All Rights Reserved.typealias Filter = (CIImage) -> CIImagelet myFilter = blur(blurRadius) >>> colorOverlay(overlayColor)let result = myFilter(image)*OTQJSBUJPO'VODUJPOBM4XJGU PCKDJP
27Copyright © Merpay, Inc. All Rights Reserved.4XJGU0CKFDUJWF$
28Copyright © Merpay, Inc. All Rights Reserved.5IBOLZPVHJUIVCDPNNFSDBSJ#BMMPPO7JFX