Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift 3 - From Expert to Beginner

Swift 3 - From Expert to Beginner

A speech for changes in Swift 3.

Wei Wang

July 21, 2016
Tweet

More Decks by Wei Wang

Other Decks in Programming

Transcript

  1. 7

  2. 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
  3. Problems of Current Cocoa APIs • Disordered • Verbose &

    Duplicated • For Objective-C. Not Swifty 10
  4. 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
  5. More Examples var array = [1, 2, 3, 4] //Swift

    2 array.removeAtIndex(1) // Swift 3 array.remove(at: 1) 17
  6. More Examples let text = "abcde" // Swift 2 text.stringByReplacingOccurrencesOfString(

    "abc", withString: "123") // Swift 3 text.replacingOccurrences( of: "abc", with: "123") 18
  7. 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
  8. 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
  9. From Swift 2 To 3 Get to be used to

    new APIs With Swift migrator Difficulty: ! 21
  10. // 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
  11. // 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
  12. 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
  13. // 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
  14. // 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
  15. Swift 3 All NS prefix removed: • NSURL → URL

    • NSDate → Date • NSData → Data • etc. From Class to Struct. Not an NSObject anymore. 34
  16. public struct URL : ReferenceConvertible, CustomStringConvertible, Equatable { public typealias

    ReferenceType = NSURL //... } • Reference type underneath • Value Semantic • Copy-on-Write 35
  17. Swift 2 The first label is omitted by default. func

    foo(a: T, b: U, c: V) { } foo(a, b: b, c: c) 39
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. From Swift 2 To 3 Stop using ++ and --

    Use += instead var i = 0 if shouldCount { i += 1 } Difficulty: ! 46
  24. // 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
  25. From Swift 2 To 3 Rename private to fileprivate Use

    private when really needed Difficulty: ! 52
  26. In Swift 3 @discardableResult func youCanIgnoreTheReturnValue() -> Int From Swift

    2 To 3 Use @discardableResult according to compile warning. Difficulty: ! 55