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
Wei Wang
July 21, 2016
Programming
2
220
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.1k
GMTC 2019 - 在分歧中发展,2019 我们能用 Swift 做什么
onevcat
0
1.1k
从 Swift 到机器学习
onevcat
2
1k
iOS Dev - The Dark Side
onevcat
0
140
面向协议编程与 Cocoa 的邂逅
onevcat
14
4.8k
如何打造一个让人愉快的框架
onevcat
4
22k
JSPatch Introduction
onevcat
0
200
Objective-C Runtime Swizzle
onevcat
0
200
Unity Memory
onevcat
0
150
Other Decks in Programming
See All in Programming
[FEConf 2025] 모노레포 절망편, 14개 레포로 부활하기까지 걸린 1년
mmmaxkim
0
1.6k
print("Hello, World")
eddie
2
530
Cache Me If You Can
ryunen344
2
690
プロパティベーステストによるUIテスト: LLMによるプロパティ定義生成でエッジケースを捉える
tetta_pdnt
0
310
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
MCPで実現するAIエージェント駆動のNext.jsアプリデバッグ手法
nyatinte
7
1.1k
奥深くて厄介な「改行」と仲良くなる20分
oguemon
1
520
意外と簡単!?フロントエンドでパスキー認証を実現する WebAuthn
teamlab
PRO
2
740
Deep Dive into Kotlin Flow
jmatsu
1
320
Design Foundational Data Engineering Observability
sucitw
3
190
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
250
Kiroの仕様駆動開発から見えてきたAIコーディングとの正しい付き合い方
clshinji
1
210
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.8k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Docker and Python
trallard
45
3.6k
Automating Front-end Workflow
addyosmani
1370
200k
Writing Fast Ruby
sferik
628
62k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
Bash Introduction
62gerente
615
210k
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