Slide 1

Slide 1 text

GOING SWIFT AND BEYOND @AYANONAGON DOTSWIFT 2016

Slide 2

Slide 2 text

2013

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

1. NeXTSTEP 2. OS X 3. iOS

Slide 5

Slide 5 text

BORROWED IDEAS

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

FIRST WAVE SWIFT

Slide 8

Slide 8 text

WHAT HOW WHY

Slide 9

Slide 9 text

WHAT

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

struct Story { let ID: String let title: String let message: String let sender: User let recipient: User let date: NSDate // ... }

Slide 13

Slide 13 text

class StoriesViewController: UIViewController { let stories: [Story] // ... }

Slide 14

Slide 14 text

class StoryDetailViewController: UIViewController { init(story: Story) }

Slide 15

Slide 15 text

class StoryDetailViewController: UIViewController { private let titleView: StoryTitleView private let senderView: AvatarView private let recipientView: AvatarView private let dateLabel: DateLabel init(story: Story) { titleView = StoryTitleView(story: story) senderView = AvatarView(user: story.sender) recipientView = AvatarView(user: story.recipient) dateLabel = DateLabel(date: story.date) } // ... }

Slide 16

Slide 16 text

url_scheme://stories/12345

Slide 17

Slide 17 text

class StoryDetailViewController: UIViewController { init(story: Story) }

Slide 18

Slide 18 text

class StoryDetailViewController: UIViewController { init(story: Story) init(storyID: String) }

Slide 19

Slide 19 text

class StoryDetailViewController: UIViewController { private let titleView: StoryTitleView private let senderView: AvatarView private let recipientView: AvatarView private let dateLabel: DateLabel init(story: Story) { /* Same as before */ } init(storyID: String) { // Hmmmmmmm. } }

Slide 20

Slide 20 text

class StoryDetailViewController: UIViewController { let storyID: String private var titleView: StoryTitleView? private var senderView: AvatarView? private var recipientView: AvatarView? private var dateLabel: DateLabel? init(story: Story) { /* Same as before */ } init(storyID: String) { self.storyID = storyID titleView = nil senderView = nil recipientView = nil dataLabel = nil } // Load everything from API in viewDidLoad? }

Slide 21

Slide 21 text

class StoryContainerViewController: UIViewController { let storyID: String init(storyID: String) { self.storyID = storyID } override func viewDidLoad() { client.showStory(ID: storyID) { result in switch result { case .Success(let story): let viewController = StoryDetailViewController(story: story) self.addChildViewController(viewController) self.view.addSubview(viewController.view) viewController.view.frame = view.bounds viewController.didMoveToParentViewController(self) case .Error(let error): // Show error } } } }

Slide 22

Slide 22 text

url_scheme://stories/12345 StoryContainerViewController(storyID: "12345")

Slide 23

Slide 23 text

url_scheme://stories/12345

Slide 24

Slide 24 text

url_scheme://stories/12345 url_scheme://users/007

Slide 25

Slide 25 text

url_scheme://stories/12345 url_scheme://users/007 url_scheme://messages/9876

Slide 26

Slide 26 text

protocol RemoteContentCoordinator { typealias Content func fetchContent(completion: Result -> Void) func viewControllerForContent(content: Result) -> UIViewController }

Slide 27

Slide 27 text

class RemoteContentContainerViewController: UIViewController { let coordinator: T init(coordinator: T) { self.remoteContentCoordinator = remoteContentCoordinator super.init(nibName: nil, bundle: nil) } override func viewDidLoad() { super.viewDidLoad() coordinator.fetchContent { content in let viewController = self.coordinator.viewControllerForContent(content) self.addChildViewController(viewController) self.view.addSubview(viewController.view) viewController.view.frame = view.bounds viewController.didMoveToParentViewController(self) } } }

Slide 28

Slide 28 text

struct StoryCoordinator: RemoteContentCoordinator { let ID: String func fetchContent(completion: Result -> Void) { client.showStory(ID: ID, completion: completion) } func viewControllerForContent(content: Result) -> UIViewController { switch content { case .Success(let story): return StoryDetailViewController(story: story) case .Error(_): return ErrorViewController(title: "Could not find story.") } } }

Slide 29

Slide 29 text

url_scheme://stories/12345 let coordinator = StoryCoordinator(ID: "12345") RemoteContentContainerViewController(coordinator: coordinator)

Slide 30

Slide 30 text

url_scheme://users/007 let coordinator = UserCoordinator(ID: "007") RemoteContentContainerViewController(coordinator: coordinator)

Slide 31

Slide 31 text

url_scheme://messages/9876 let coordinator = MessageCoordinator(ID: "9876") RemoteContentContainerViewController(coordinator: coordinator)

Slide 32

Slide 32 text

class StoryDetailViewController: UIViewController { let storyID: String private var titleView: StoryTitleView? private var senderView: AvatarView? private var recipientView: AvatarView? private var dateLabel: DateLabel? init(story: Story) { /* Same as before */ } init(storyID: String) { self.storyID = storyID titleView = nil senderView = nil recipientView = nil dataLabel = nil } // Load everything from API in viewDidLoad? }

Slide 33

Slide 33 text

class StoryDetailViewController: UIViewController { private let titleView: StoryTitleView private let senderView: AvatarView private let recipientView: AvatarView private let dateLabel: DateLabel init(story: Story) { titleView = StoryTitleView(story: story) senderView = AvatarView(user: story.sender) recipientView = AvatarView(user: story.recipient) dateLabel = DateLabel(date: story.date) } // ... }

Slide 34

Slide 34 text

HOW

Slide 35

Slide 35 text

SWIFT IS OPEN-SOURCE

Slide 36

Slide 36 text

GITHUB.COM/APPLE/ SWIFT

Slide 37

Slide 37 text

GITHUB.COM/APPLE/ SWIFT-EVOLUTION

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

80% PLANNING 20% CODING

Slide 41

Slide 41 text

WHY

Slide 42

Slide 42 text

GENERICS ENUMS PROTOCOLS

Slide 43

Slide 43 text

GENERICS ENUMS PROTOCOLS

Slide 44

Slide 44 text

OPTIONALS VALUE-TYPES FUNCTIONAL

Slide 45

Slide 45 text

OPTIONALS VALUE-TYPES FUNCTIONAL

Slide 46

Slide 46 text

SO, WHY?

Slide 47

Slide 47 text

SHIP A GREAT PRODUCT THAT USERS LOVE

Slide 48

Slide 48 text

SHARE

Slide 49

Slide 49 text

SHARE > Write > Speak > Recommend books / articles

Slide 50

Slide 50 text

TRY

Slide 51

Slide 51 text

TRY > Fix a bug in backend or web code > Learn a different language > Talk about architecture with an Android(!) engineer

Slide 52

Slide 52 text

INCLUDE

Slide 53

Slide 53 text

INCLUDE > Get them excited about Swift > Be open to unfamiliar ideas > Be welcoming

Slide 54

Slide 54 text

THANK YOU MERCI BEAUCOUP

Slide 55

Slide 55 text

No content