Slide 1

Slide 1 text

func migrating(from: ObjC) -> Swift! [objC autorelease]

Slide 2

Slide 2 text

Why?

Slide 3

Slide 3 text

https://twitter.com/clattner_llvm

Slide 4

Slide 4 text

WWDC Appearances swift objective-c 2014 19 63 2015 71 15

Slide 5

Slide 5 text

„…in future, all the 
 nice things will only 
 come to swift…“ Apple Software Engineer

Slide 6

Slide 6 text

What will you lose on the way?

Slide 7

Slide 7 text

* [ ] .h .m Good old Friends

Slide 8

Slide 8 text

Runtime Dynamics NSInvocation NSMethodSignature [obj load] nil messaging Macros https://developer.apple.com/swift/blog/?id=19

Slide 9

Slide 9 text

What will you gain?

Slide 10

Slide 10 text

Types Autoclosures Structs Generics Implicit Member Expressions Custom Operators Typealiases Enums Currying Recursive Enumerations Property Observers Protocol Extensions Generators Subscripts Optionals Lazyness Pattern Matching Tuples Immutability ErrorType Access Control

Slide 11

Slide 11 text

Simplicity view.backgroundColor = .redColor() [view setBackgroundColor: [UIColor redColor]]

Slide 12

Slide 12 text

@warn_unused_result func flatMap (@noescape _ transform: 
 (Self.Generator.Element) throws -> T?) 
 rethrows -> [T] Kinda Simplicity https://developer.apple.com/library/ios/documentation/Swift/Reference/ Swift_SequenceType_Protocol/index.html

Slide 13

Slide 13 text

https://github.com/typelift/Swiftz/blob/master/Swiftz/EitherExt.swift Not-So-Simplicity-At-All

Slide 14

Slide 14 text

What will remain?

Slide 15

Slide 15 text

SDK XYZKit Model View Controller Retain Cycles Xcode

Slide 16

Slide 16 text

How to start?

Slide 17

Slide 17 text

Existing Objective-C Project No Warnings https://developer.apple.com/library/ios/documentation/Swift/Conceptual/ BuildingCocoaApps/index.html#//apple_ref/doc/uid/TP40014216-CH2-ID0 Using Swift with Cocoa and Objective-C

Slide 18

Slide 18 text

Bridging Header Add Imports as you need them Automatically generated by compiler Generated Header …using obj-c in swift… …using swift in obj-c…

Slide 19

Slide 19 text

Optimize Obj-C for Swift NS_ASSUME_NONNULL_BEGIN nonnull|nullable|null_unspecified NSArray<__kindof UIView *> *someViews; https://developer.apple.com/videos/play/wwdc2015-401/

Slide 20

Slide 20 text

Try to avoid designing Swift for Obj-C You’ll have access to anything within a class or protocol that’s 
 marked with the @objc attribute as long as it’s compatible with Objective-C. 
 This excludes Swift-only features such as those listed here: Generics Tuples Enumerations defined in Swift without Int raw value type Structures defined in Swift Top-level functions defined in Swift Global variables defined in Swift Typealiases defined in Swift Swift-style variadics Nested types Curried functions https://developer.apple.com/library/ios/documentation/Swift/ Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/ uid/TP40014216-CH10-ID122

Slide 21

Slide 21 text

Adding 
 New 
 Controller Refactor Existing Controller 1 2 Where to use Swift 
 in the beginning? It`s ok to build a parallel universe

Slide 22

Slide 22 text

Find New Solutions™ and yeah, use guard…

Slide 23

Slide 23 text

Swift will make your life easier title = ~"Select Title" Custom Operator for i18n

Slide 24

Slide 24 text

struct Storyboard { struct Segues { static let channelInfo = "channelInfo" } struct Cells { static let channelCell = "channelCell" } struct ReuseView { static let sectionHeader = "header" } } Swift will make your life easier Define Segues, Identifier, and so forth

Slide 25

Slide 25 text

Swift will make your life easier @IBOutlet weak var myCellView: UIView! { didSet { myCellView.backgroundColor = .redColor() myCellView.layer.masksToBounds = true myCellView.layer.cornerRadius = 2 } } Configure Views after outlet binding

Slide 26

Slide 26 text

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { switch (segue.identifier, segue.destinationViewController, collectionView?.indexPathsForSelectedItems()?.first) { case let(Storyboard.Segues.info?, controller as InfoController, index?): controller.channel = channels?.get(index.row) default: break } } Swift will make your life easier Pattern Match Your Life

Slide 27

Slide 27 text

Swift will make your life easier for (a, b) in (0...2).zipWithFollower() { print(a, b) // 0,1 1,2 2,nil } public struct ZipWithFollower: SequenceType { public typealias Generator = AnyGenerator<(T.Generator.Element, T.Generator.Element?)> let sequence: T public init(_ sequence: T) { self.sequence = sequence } public func generate() -> Generator { var generator1 = sequence.generate() var generator2 = sequence.generate() _ = generator2.next() return anyGenerator { guard let element1 = generator1.next() else { return nil } return (element1, generator2.next()) } } } Clean up your control flow

Slide 28

Slide 28 text

struct StateFlow { let at: S let to: T -> S } let wizardFlow: [StateFlow] = [ from(.Init).to { config in if config.useCustomSeletion { return .ComponentWizard } return .ComponentSelection } ] Swift will make your life easier Double Down on Types

Slide 29

Slide 29 text

@elmkretzer Go Swift! www.symentis.com