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

Swift

 Swift

Slides from Mobile Optimized 2014

Denis Lebedev

June 29, 2014
Tweet

More Decks by Denis Lebedev

Other Decks in Programming

Transcript

  1. Swift
    Denis Lebedev, iOS @ Yandex

    View Slide

  2. Agenda
    • Introduction
    • Objective-C bridging
    • Good-to-know features
    • “Where can I Swift?”

    View Slide

  3. Swift
    Chris Lattner, Swift creator

    View Slide

  4. Swift
    • Multi-paradigm
    • Static, inferred typing
    • Bridged with Objective-C
    • No pointers

    View Slide

  5. –Someone at WWDC Keynote
    It’s like “Objective-C without C.”

    View Slide

  6. View Slide

  7. Swift features
    • Namespacing*
    • Generic classes & functions
    • Named/default parameters
    • Functions are first class citizens
    • Optional types

    View Slide

  8. Optionals
    • Used in situations where value may be absent
    • Alternative for obj-c nil passing
    • works with any type

    View Slide

  9. Optionals
    - (NSInteger)indexOfObject:(id)object;

    View Slide

  10. Optionals
    func indexOf(object: AnyObject) -> Int?

    View Slide

  11. Optionals
    • Can be safely unwrapped (if/else)
    • Can be force unwrapped (runtime exception if
    value is missing)

    View Slide

  12. Classes, structs,
    enumerations
    • Classes passed by reference, structs - by value
    • Using a struct has no runtime penalty
    • All scalars and even Bool are structs
    • Enumerations are extremely powerful

    View Slide

  13. Enumerations
    enum Tree {
    case Empty
    case Leaf
    case Node
    }

    View Slide

  14. Enumerations
    enum Tree {
    case Empty
    case Leaf(Int)
    case Node(Tree, Tree)
    }

    View Slide

  15. Enumerations
    enum Tree {
    case Empty
    case Leaf(T)
    case Node(Tree, Tree)
    }

    View Slide

  16. Enumerations
    let tree: Tree = .Node(.Leaf(1), .Leaf(1))

    View Slide

  17. Enumerations
    enum Tree {
    case Empty
    case Leaf(T)
    case Node(Tree, Tree)
    !
    func depth(t: Tree) -> Int {
    return 0
    }
    }

    View Slide

  18. Enumerations
    enum Tree {
    case …
    !
    func depth() -> Int {
    func _depth(t: Tree) -> Int {
    return 0
    }
    return _depth(self)
    }
    }

    View Slide

  19. Enumerations
    enum Tree {
    case …
    !
    func depth() -> Int {
    func _depth(t: Tree) -> Int {
    switch t {
    case .Empty:
    return 0
    }
    return _depth(self)
    }
    }

    View Slide

  20. Enumerations
    enum Tree {
    case …
    !
    func depth() -> Int {
    func _depth(t: Tree) -> Int {
    switch t {
    case .Empty:
    return 0
    case .Leaf(let _):
    return 1
    }
    return _depth(self)
    }
    !
    }

    View Slide

  21. Enumerations
    enum Tree {
    case …
    !
    func depth() -> Int {
    func _depth(t: Tree) -> Int {
    switch t {
    case .Empty:
    return 0
    case .Leaf(let _):
    return 1
    case .Node(let lhs, let rhs):
    return max(_depth(lhs), _depth(rhs))
    }
    }
    return _depth(self)
    }
    }

    View Slide

  22. Enumerations
    enum Tree {
    case Empty
    case Leaf(T)
    case Node(Tree, Tree)
    !
    func depth() -> Int {
    func _depth(t: Tree) -> Int {
    switch t {
    case .Empty:
    return 0
    case .Leaf(let _):
    return 1
    case .Node(let lhs, let rhs):
    return max(_depth(lhs), _depth(rhs))
    }
    }
    return _depth(self)
    }
    }

    View Slide

  23. Collections
    • Array, Dictionary, String (contains Char)
    • Collections are structs
    • Implicitly bridged to Cocoa collection types

    View Slide

  24. Collections
    func filter(…) -> Bool) ->
    FilterSequenceView
    !
    func reverse(source: C) ->
    ReverseView
    Some of operations are lazy evaluated

    View Slide

  25. Collections
    func filter(…) -> Bool) ->
    FilterSequenceView
    !
    func reverse(source: C) ->
    ReverseView
    Some of operations are lazy evaluated

    View Slide

  26. Built-in immutability
    var b = 3
    b += 1
    !
    let a = 3
    a += 1 // error

    View Slide

  27. Dictionary immutability
    let d = ["key0": 0]
    !
    d["key"] = 3 //error
    d.updateValue(1, forKey: "key1") //error

    View Slide

  28. Array immutability
    let c = [1, 2, 3]
    !
    c[0] = 3 // success
    c.append(5) // fail

    View Slide

  29. Array immutability
    let c = [1, 2, 3]
    !
    c[0] = 3 // success
    c.append(5) // fail
    It’s a bug: !
    https://devforums.apple.com/message/971330#971330

    View Slide

  30. Extensions
    • extends any named type (struct, enum, class)
    • structures code

    View Slide

  31. Extensions
    struct Foo {
    let value : Int
    }
    !
    extension Foo : Printable {
    var description : String {
    get {return "Foo"}
    }
    }
    !
    extension Foo : Equatable {
    }
    !
    func ==(lhs: Foo, rhs: Foo) -> Bool {
    return lhs.value == rhs.value
    }

    View Slide

  32. What Swift is missing
    • Preprocessor
    • Exceptions
    • Access control *
    • KVO, KVC
    • Compiler attributes (platforms, deprecations, etc.)
    • performSelector: is unavailable

    View Slide

  33. Objective-C bridging
    • Call Obj-c from Swift
    • Call Swift from Objc with limitations
    • Call CoreFoundation types directly
    • C++ is not allowed (should be wrapped in Objc)
    • Subclassing Swift classes not allowed in Objc

    View Slide

  34. Objective-C bridging
    • NSArray < - > Array
    • NSDictionary < - > Dictionary
    • NSNumber - > Int, Double, Float

    View Slide

  35. Objective-C bridging
    @objc class Foo {
    init (bar: String) { /*...*/ }
    }

    View Slide

  36. Objective-C bridging
    @objc(objc_Foo)
    class Foo {
    !
    @objc(initWithBar:)
    init (bar: String) { /*...*/ }
    !
    }

    View Slide

  37. Objective-C bridging
    Foo *foo = [[Foo alloc] initWithBar:@"Bar"];

    View Slide

  38. Objective-C bridging
    func convertPoint(point: CGPoint, toWindow window:
    UIWindow!) -> CGPoint
    - (CGPoint)convertPoint:(CGPoint)point toWindow:
    (UIWindow *)window

    View Slide

  39. Objective-C bridging
    • All object types are mapped as implicitly
    unwrapped optionals (T!)
    • All ‘id’ types are mapped as ‘AnyObject’

    View Slide

  40. Swift internals
    • Swift objects are Obj-c objects
    • Implicit root class ‘SwiftObject’
    • Ivars type encoding is stored separately
    • Method’s vtable
    • Name mangling

    View Slide

  41. Name mangling
    class Foo {
    func bar() -> Bool {
    return false
    }
    }
    _TFC9test3Foo3barfS0_FT_Sb
    Swift keeps function metadata encoded in function symbols

    View Slide

  42. Performance
    • 10-100 x slower than C++ (-O0)
    • 10 x slower than C++ (-O3)
    • 1 x as C++ (-Ofast)*

    View Slide

  43. Performance
    • Swift is still in beta
    • Unoptimized calls of retain/release in loops

    View Slide

  44. Cross-platform code
    #if os(iOS)
    typealias View = UView
    #else
    typealias View = NSView
    #endif
    !
    class MyControl : View {
    }

    View Slide

  45. Pattern matching
    let point = (0, 1)
    !
    if point.0 >= 0 && point.0 <= 1 &&
    point.1 >= 0 && point.1 <= 1 {
    println("I")
    }
    !
    ...

    View Slide

  46. Pattern matching
    let point = (0, 1)
    !
    switch point {
    case (0...1, 0...1):
    println("I")

    }

    View Slide

  47. Pattern matching
    let point = (0, 1)
    !
    switch point {
    case (0, 0):
    println("Point is at the origin")
    case (0...1, 0...1):
    println("I")
    case (-1...0, 0...1):
    println("II")
    case (-1...0, -1...0):
    println("III")
    case(0...1, -1...0):
    println("IV")
    default:
    println(“I don’t know.")
    }

    View Slide

  48. Function currying
    func add(a: Int)(b: Int) -> Int {
    return a + b
    }
    !
    let foo = add(5)(b: 3) // 8
    !
    let add5 = add(5) // (Int) -> Int
    let bar = add5(b: 3) // 8

    View Slide

  49. Auto closures
    • Wraps function argument in explicit closure
    func assert(condition:() -> Bool, message: String) {
    #if DEBUG
    if !condition() { println(message) }
    #endif
    }
    !
    assert({5 % 2 == 0}, "5 isn't an even number.")

    View Slide

  50. Auto closures
    Wraps function argument in explicit closure
    func assert(condition: @auto_closure () -> Bool,
    message: String) {
    #if DEBUG
    if !condition() { println(message) }
    #endif
    }
    !
    assert(5 % 2 == 0, "5 isn't an even number.")

    View Slide

  51. Implicit type conversion
    struct Box {
    let _value : T
    init (_ value: T) {
    _value = value
    }
    }
    !
    let boxedInt = Box(1) //Box

    View Slide

  52. Implicit type conversion
    func foo(i: Int) {…}
    !
    foo(boxedInt)
    //error: ’Box' is not convertible to 'Int'

    View Slide

  53. Implicit type conversion
    extension Box {
    @conversion func __conversion() -> T {
    return _value
    }
    }
    !
    !
    foo(boxedInt) //success

    View Slide

  54. Implicit type conversion
    • allows any type to be ‘nil’ (which has NilType)
    • allows toll-free-bridging with Cocoa types

    View Slide

  55. Reflection
    struct Foo {
    var str = "Apple"
    let int = 13
    func foo() { }
    }
    !
    !
    reflect(Foo()).count // 2
    !
    reflect(Foo())[0].0 // "str"
    reflect(Foo())[0].1.summary // "Apple

    View Slide

  56. Direct call of C functions
    @asmname - allows to provide a Swift interface for C functions
    @asmname("my_c_func")
    func my_c_func(UInt64, CMutablePointer) -> CInt;

    View Slide

  57. Scripting and REPL
    • xcrun swift - launches REPL
    • xcrun -i ‘file.swift’ - executes script

    View Slide

  58. Where can I swift?
    • BDD Testing framework: Quick!
    • Reactive programming: RXSwift
    • Model mapping: Crust
    • Handy JSON processing: SwiftyJSON

    View Slide

  59. Thx!
    @delebedev
    [email protected]

    View Slide

  60. Credits
    • http://nondot.org/sabre/
    • https://devforums.apple.com/thread/227288
    • http://andelf.github.io/blog/2014/06/08/swift-implicit-type-cast/
    • https://www.youtube.com/watch?v=Ii-02vhsdVk
    • http://www.eswick.com/2014/06/inside-swift/
    • http://article.gmane.org/gmane.comp.compilers.clang.devel/37217
    • http://stackoverflow.com/questions/24101718/swift-performance-sorting-arrays
    • http://www.splasmata.com/?p=2798
    • https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

    View Slide