Migrating Objective-C to Swift

Post on 18-Jan-2017

198 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

Transcript

func migrating(from: ObjC) -> Swift!

[objC autorelease]

Why?

https://twitter.com/clattner_llvm

WWDC Appearances

swift objective-c

2014 19 632015 71 15

„…in future, all the nice things will only

come to swift…“Apple Software Engineer

What will you loseon the way?

* [ ] .h .mGood old Friends

Runtime Dynamics

NSInvocation NSMethodSignature

[obj load] nil messaging

Macros

https://developer.apple.com/swift/blog/?id=19

What will you gain?

Types

Autoclosures

Structs

Generics

Implicit Member Expressions

Custom Operators

Typealiases

Enums

Currying

Recursive Enumerations

Property ObserversProtocol Extensions

Generators

Subscripts

Optionals

Lazyness

Pattern Matching

Tuples

Immutability

ErrorType

Access Control

Simplicity

view.backgroundColor = .redColor()

[view setBackgroundColor: [UIColor redColor]]

@warn_unused_result func flatMap<T> (@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

https://github.com/typelift/Swiftz/blob/master/Swiftz/EitherExt.swift

Not-So-Simplicity-At-All

What will remain?

SDKXYZKit

Model View ControllerRetain Cycles

Xcode

How to start?

Existing Objective-C ProjectNo 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

Bridging HeaderAdd Imports as you need them

Automatically generated by compilerGenerated Header

…using obj-c in swift…

…using swift in obj-c…

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/

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

Adding New Controller

Refactor Existing Controller1 2

Where to use Swift in the beginning?

It`s ok to build a parallel universe

Find New Solutions™ and yeah, use guard…

Swift will makeyour life easier

title = ~"Select Title"

Custom Operator for i18n

struct Storyboard { struct Segues { static let channelInfo = "channelInfo" } struct Cells { static let channelCell = "channelCell" } struct ReuseView { static let sectionHeader = "header" } }

Swift will makeyour life easier

Define Segues, Identifier, and so forth

Swift will makeyour life easier

@IBOutlet weak var myCellView: UIView! { didSet { myCellView.backgroundColor = .redColor() myCellView.layer.masksToBounds = true myCellView.layer.cornerRadius = 2 } }

Configure Views after outlet binding

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 makeyour life easier

Pattern Match Your Life

Swift will makeyour life easier

for (a, b) in (0...2).zipWithFollower() { print(a, b) // 0,1 1,2 2,nil }

public struct ZipWithFollower<T: SequenceType>: 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

struct StateFlow<S,T> { let at: S let to: T -> S }

let wizardFlow: [StateFlow<WizardState, WizardConfig>] = [ from(.Init).to { config in if config.useCustomSeletion { return .ComponentWizard } return .ComponentSelection } ]

Swift will makeyour life easier

Double Down on Types

@elmkretzer

Go Swift!

www.symentis.com

top related