This document discusses migrating from Objective-C to Swift and some of the benefits and challenges of doing so. It notes that Swift will provide gains like types, generics, and simplicity while some Objective-C features like .h/.m files will be lost. It provides recommendations for how to start migrating an existing Objective-C project to Swift like adding imports to a bridging header and optimizing Objective-C for Swift. Specific examples are given of how Swift can make code easier to read and maintain.
17. 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
18. Bridging Header
Add Imports as you need them
Automatically generated by compiler
Generated Header
…using obj-c in swift…
…using swift in obj-c…
19. 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/
20. 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
23. Swift will make
your life easier
title = ~"Select Title"
Custom Operator for i18n
24. 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
25. 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
26. 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
27. 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<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
28. 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 make
your life easier
Double Down on Types