Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Swift 3 - From Expert to Beginner
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Wei Wang
July 21, 2016
Programming
2
270
Swift 3 - From Expert to Beginner
A speech for changes in Swift 3.
Wei Wang
July 21, 2016
Tweet
Share
More Decks by Wei Wang
See All by Wei Wang
網路之難,難於上青天 - iPlayground 2019
onevcat
11
5.4k
GMTC 2019 - 在分歧中发展,2019 我们能用 Swift 做什么
onevcat
0
1.2k
从 Swift 到机器学习
onevcat
2
1.1k
iOS Dev - The Dark Side
onevcat
0
160
面向协议编程与 Cocoa 的邂逅
onevcat
14
5k
如何打造一个让人愉快的框架
onevcat
4
22k
JSPatch Introduction
onevcat
0
220
Objective-C Runtime Swizzle
onevcat
0
230
Unity Memory
onevcat
0
160
Other Decks in Programming
See All in Programming
Understanding Apache Lucene - More than just full-text search
spinscale
0
140
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.4k
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
170
20260315 AWSなんもわからん🥲
chiilog
2
180
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
500
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
190
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
150
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
150
RailsのValidatesをSwift Macrosで再現してみた
hokuron
0
130
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
6
1.1k
Nostalgia Meets Technology: Super Mario with TypeScript
manfredsteyer
PRO
0
110
Codex の「自走力」を高める
yorifuji
0
1.3k
Featured
See All Featured
Navigating Weather and Climate Data
rabernat
0
150
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
160
The Spectacular Lies of Maps
axbom
PRO
1
650
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.5k
Designing for Performance
lara
611
70k
Embracing the Ebb and Flow
colly
88
5k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Everyday Curiosity
cassininazir
0
180
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
300
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Transcript
SP TF JP20028 - onevcat Wei Wang 1
Recently 2
Swift From Beginner to Expert JP20028 - onevcat, Nov 2014
3
Swift 3 From Expert to Beginner JP20028 - onevcat, Jul
2016 4
Open + Evolution 5
Swift Evolution Repo1 SE-XXXX New Site: https://apple.github.io/ swift-evolution/ 1 https://github.com/apple/swift-evolution
6
7
Important proposals & Broken APIs 8
SE-0023 API Design Guidelines And SE-0006 Apply API Guidelines to
the Standard Library SE-0005 Better Translation of Objective-C APIs Into Swift SE-0033 Import Objective-C Constants as Swift Types 9
Problems of Current Cocoa APIs • Disordered • Verbose &
Duplicated • For Objective-C. Not Swifty 10
Clarity let text = "Hello world" text.stringByAppendingString(", Swift2") 11
Clarity public func stringByAppendingString(aString: String) -> String 12
Clarity public func stringByAppendingString(aString: String) -> String 13
Clarity public func appending(_ aString: String) -> String 14
Clarity // Swift 2 text.stringByAppendingString(", Swift2") // Swift 3 text.appending(",
Swift3") 15
More Examples // Swift 2 let color = UIColor.blackColor() let
app = UIApplication.sharedApplication() // Swift 3 let color = UIColor.black() // view.backGroundColor = .black() <- Type Infer let app = UIApplication.shared 16
More Examples var array = [1, 2, 3, 4] //Swift
2 array.removeAtIndex(1) // Swift 3 array.remove(at: 1) 17
More Examples let text = "abcde" // Swift 2 text.stringByReplacingOccurrencesOfString(
"abc", withString: "123") // Swift 3 text.replacingOccurrences( of: "abc", with: "123") 18
Exception // Remove KVO observer // Swift 2 app.removeObserver(self, forKeyPath:
"valueKey") // Swift 3 app.removeObserver(self, forKeyPath: "valueKey") // Why not? app.remove(observer: self, for: "valueKey") 19
Exception func removeObserver( _ observer: NSObject, forKeyPath keyPath: String )
When NSObject, Any, AnyObject, Int, String included in method signature: • Declaration is fine. • But using is not so clear. 20
From Swift 2 To 3 Get to be used to
new APIs With Swift migrator Difficulty: ! 21
SE-0088 Modernize libdispatch for Swift 3 naming conventions 22
// Swift 2 let queue = dispatch_queue_create( "my.queue", DISPATCH_QUEUE_CONCURRENT) dispatch_async(queue)
{ doHeavyWork() dispatch_async(dispatch_get_main_queue(), { updateUI() }) } dispatch_after( dispatch_time( DISPATCH_TIME_NOW, Int64(3500 * NSEC_PER_SEC)), dispatch_get_main_queue()) { call() } 23
// Swift 3 let queue = DispatchQueue( label: "my.queue", attributes:
.concurrent) queue.async { doHeavyWork() DispatchQueue.main.async { updateUI() } } let time = DispatchTime.now() + 3.5 DispatchQueue.main.after(when: time) { call() } // Also for group, semaphore, IO etc. 24
Not only GCD... // Swift 2 func rotationAround(offset: CGPoint, angle:
CGFloat, transform: CGAffineTransform = CGAffineTransformIdentity) -> CGAffineTransform { var result = CGAffineTransformTranslate(transform, offset.x, offset.y) result = CGAffineTransformRotate(result, angle) return CGAffineTransformTranslate(result, -offset.x, -offset.y) } 25
// Swift 2 func rotationAround(offset: CGPoint, angle: CGFloat, transform: CGAffineTransform
= CGAffineTransformIdentity) -> CGAffineTransform { var result = CGAffineTransformTranslate(transform, offset.x, offset.y) result = CGAffineTransformRotate(result, angle) return CGAffineTransformTranslate(result, -offset.x, -offset.y) } // Swift 3 func rotationAround(offset: CGPoint, angle: CGFloat, transform: CGAffineTransform = .identity) -> CGAffineTransform { return transform.translateBy(x: offset.x, y: offset.y) .rotate(angle) .translateBy(x: -offset.x, y: -offset.y) } 26
// Swift 2 func trace(in context: CGContext, path: CGPath) {
let red = CGColorCreateGenericRGB(1, 0, 0, 1) CGContextSaveGState(context) CGContextAddPath(context, path) CGContextSetStrokeColorWithColor(context, red) CGContextStrokePath(context) CGContextRestoreGState(context) } // Swift 3 func trace(in context: CGContext, path: CGPath) { let red = CGColor.red context.saveGState() context.addPath(path) context.setStrokeColor(red) context.strokePath() context.restoreGState() } 27
Imported by Compiler from C No Runtime Overhead 28
From Swift 2 To 3 Just forget the legacy C
Difficulty: ! 29
SE-0069 Mutability and Foundation Value Types SE-0086 Drop NS Prefix
in Swift Foundation 30
Value Type is Good 31
Value Type is Good • Immutability • Less State •
Performance 32
Struct • String • Array Class • NSURL • NSDate
• NSData 33
Swift 3 All NS prefix removed: • NSURL → URL
• NSDate → Date • NSData → Data • etc. From Class to Struct. Not an NSObject anymore. 34
public struct URL : ReferenceConvertible, CustomStringConvertible, Equatable { public typealias
ReferenceType = NSURL //... } • Reference type underneath • Value Semantic • Copy-on-Write 35
Still be a class: • NSNotificationCenter → NotificationCenter • NSUserDefaults
→ UserDefaults • etc. 36
From Swift 2 To 3 No NS prefix needed Difficulty:
! 37
SE-0046 Establish consistent label behavior across all parameters including first
labels 38
Swift 2 The first label is omitted by default. func
foo(a: T, b: U, c: V) { } foo(a, b: b, c: c) 39
Swift 3 You need to write the first label by
default: func foo(a: T, b: U, c: V) { } foo(a: a, b: b, c: c) 40
Swift 3 Back compatibility Your current API will be imported
as: func foo(_ a: T, b: U, c: V) { } But you should consider in Swift 3 way and give it a fix. 41
SE-0004 Remove the ++ and -- operators 42
let a = ++x // Plus self (x), then use
let b = x++ // Use, then plus let c = --x // Minus, then use let d = x-- // Use, then minus 43
let a = ++x // Plus self (x), then use
let b = x++ // Use, then plus let c = --x // Minus, then use let d = x-- // Use, then minus var i = 0 if shouldCount { i++ } 44
let a = ++x // Plus self (x), then use
let b = x++ // Use, then plus let c = --x // Minus, then use let d = x-- // Use, then minus (i++)+(++i)+(++i)+(i++)+(i++) = ? // Good luck! 45
From Swift 2 To 3 Stop using ++ and --
Use += instead var i = 0 if shouldCount { i += 1 } Difficulty: ! 46
SE-0025 Scoped Access Level 47
Swift 2 public internal private ← current file 48
Swift 3 public internal fileprivate ← current file private 49
Swift 3 public internal fileprivate private ← current scope 50
// Sample.swift struct MyStruct { private var name: String? func
sayHello() { print("How are you?") } private func damnIt() { print("Damn you!") } // Cannot use `sayMorning` } extention MyStruct { // Cannot use `damnIt` and `name` private func sayMorning() { print("Morning!") sayHello() } } 51
From Swift 2 To 3 Rename private to fileprivate Use
private when really needed Difficulty: ! 52
SE-0047 Defaulting non-Void functions so they warn on unused results
53
In Swift 2 @warn_unused_result(mutable_variant="sortInPlace") public func sort() -> [Self.Generator.Element] 54
In Swift 3 @discardableResult func youCanIgnoreTheReturnValue() -> Int From Swift
2 To 3 Use @discardableResult according to compile warning. Difficulty: ! 55
Bad News 56
• Full of breaking changes • From beginner to expert,
again • Third party support 57
Good News 58
Xcode 8 contains both Swift 2.3 and Swift 3 59
Is it worth upgrading to Swift 3? 60
It depends. 61
Thanks 62