Slide 1

Slide 1 text

Swift [on a deadline] @orta

Slide 2

Slide 2 text

Full writeup on Artsy blog @orta

Slide 3

Slide 3 text

Artsy @orta

Slide 4

Slide 4 text

OSS by Default @orta

Slide 5

Slide 5 text

Kiosk @orta

Slide 6

Slide 6 text

@orta

Slide 7

Slide 7 text

@orta

Slide 8

Slide 8 text

@orta

Slide 9

Slide 9 text

Eidolon @orta

Slide 10

Slide 10 text

I ❤ languages @orta

Slide 11

Slide 11 text

Obj-C // // main.m // snapshots // // Created by orta therox on 15/12/2007. // Copyright __MyCompanyName__ 2007 . All rights reserved. // @orta

Slide 12

Slide 12 text

❤ ruby @orta

Slide 13

Slide 13 text

! swift @orta

Slide 14

Slide 14 text

Good bits @orta

Slide 15

Slide 15 text

$0 $1 // Add subviews cellSubviews.map{ self.contentView.addSubview($0) } @orta

Slide 16

Slide 16 text

Overloading public func ==(lhs: UIStoryboardSegue, rhs: SegueIdentifier) -> Bool { return lhs.identifier == rhs.rawValue } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue == .ShowSaleArtworkDetails { let saleArtwork = sender as SaleArtwork! ... } } @orta

Slide 17

Slide 17 text

Lazy lazy var keypadSignal:RACSignal! = self.keypadContainer.keypad?.keypadSignal lazy var clearSignal:RACSignal! = self.keypadContainer.keypad?.rightSignal lazy var deleteSignal:RACSignal! = self.keypadContainer.keypad?.leftSignal lazy var provider:ReactiveMoyaProvider = Provider.sharedProvider @orta

Slide 18

Slide 18 text

Clo-uncs func isZeroLengthString(string:AnyObject!) -> AnyObject! { return countElements(string as String) == 0 } ... let numberIsInvalidSignal = RACObserve(bidDetails.newUser, "phoneNumber").map(isZeroLengthString) RAC(confirmButton, "enabled") <~ numberIsInvalidSignal.notEach() @orta

Slide 19

Slide 19 text

Inline @IBOutlet var bidButton: Button! @IBAction func bidButtonTapped(sender: AnyObject) { let identifier = hasAlreadyPlacedABid ? SegueIdentifier.PlaceAnotherBid : SegueIdentifier.ConfirmBid performSegue(identifier) } @orta

Slide 20

Slide 20 text

Language Coupling @orta

Slide 21

Slide 21 text

Xcode @orta

Slide 22

Slide 22 text

@orta

Slide 23

Slide 23 text

Quotes @orta

Slide 24

Slide 24 text

In just six months, Swift’s high performance and clean syntax have made it the most popular way to find out that SourceKitService Terminated — @Horse_iOS // https://twitter.com/Horse_iOS/status/533027167488454656 @orta

Slide 25

Slide 25 text

There is so much you cannot do with Swift, my code is littered with @objc. NSObject and a whole load more legacy #SwiftLang — @ColinEberhardt - ( Shinobi Controls ) // https://twitter.com/ColinEberhardt/status/ 531506177180700673 @orta

Slide 26

Slide 26 text

I started looking at Swift today and I've restarted the playground at least 20 times in the past hour. Hard to get excited about this… — @chockenberry - ( Twitteriffic.app ) // https://twitter.com/chockenberry/status/ 532270455537692672 @orta

Slide 27

Slide 27 text

I’m getting multiple SourceKitService crashed for every(!) line I write in this Swift project. This stuff is far from ready… — @pieteromvlee - ( Sketch.app ) [^om] // https://twitter.com/pieteromvlee/status/ 531534471708020736 @orta

Slide 28

Slide 28 text

For all the crap I give #swift, the syntax is still much nicer than ObjC. Hopefully the expressiveness of ObjC is brought quickly. — @owensd - ( MS Office ) // https://twitter.com/owensd/status/524972593774743553 @orta

Slide 29

Slide 29 text

Issues @orta

Slide 30

Slide 30 text

Completion @orta

Slide 31

Slide 31 text

Lib Code Signing @orta

Slide 32

Slide 32 text

Git Submodules @orta

Slide 33

Slide 33 text

No Incremental Builds @orta

Slide 34

Slide 34 text

Code Signing @orta

Slide 35

Slide 35 text

Playgrounds @orta

Slide 36

Slide 36 text

No Pch Files @orta

Slide 37

Slide 37 text

Stack Trace @orta

Slide 38

Slide 38 text

RAC @orta

Slide 39

Slide 39 text

Swift + RAC @orta

Slide 40

Slide 40 text

func waitForBidResolution () -> RACSignal { return self.pollForUpdatedSaleArtwork().then { [weak self] (_) in return self == nil ? RACSignal.empty() : self!.checkForMaxBid() } .doNext { _ in self.bidIsResolved = true return // If polling fails, we can still show bid confirmation. Do not error. } .catchTo( RACSignal.empty() ) } src @orta

Slide 41

Slide 41 text

bidderNetworkModel.createOrGetBidder().doError { (error) -> Void in self.bidderError() } .then { if !self.placingBid { ARAnalytics.event("Registered New User Only") return RACSignal.empty() } ARAnalytics.event("Started Placing Bid") return self.placeBid() } .then { [weak self] (_) in if self == nil { return RACSignal.empty() } self?.bidCheckingModel = self?.bidCheckingModel ?? self?.createBidCheckingModel() if self?.placingBid == false { return RACSignal.empty() } return self!.bidCheckingModel.waitForBidResolution() } .subscribeCompleted { [weak self] (_) in self?.finishUp() return } src @orta

Slide 42

Slide 42 text

@orta

Slide 43

Slide 43 text

@orta

Slide 44

Slide 44 text

The Future of CocoaPods @orta

Slide 45

Slide 45 text

Wait a year @orta

Slide 46

Slide 46 text

github.com/artsy/eidolon @orta

Slide 47

Slide 47 text

@orta