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 features • Namespacing* • Generic classes & functions •

    Named/default parameters • Functions are first class citizens • Optional types
  2. Optionals • Used in situations where value may be absent

    • Alternative for obj-c nil passing • works with any type
  3. Optionals • Can be safely unwrapped (if/else) • Can be

    force unwrapped (runtime exception if value is missing)
  4. 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
  5. Enumerations enum Tree<T> { case Empty case Leaf(T) case Node(Tree,

    Tree) ! func depth<T>(t: Tree<T>) -> Int { return 0 } }
  6. Enumerations enum Tree<T> { case … ! func depth() ->

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

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

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

    Int { func _depth<T>(t: Tree<T>) -> 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) } }
  10. Enumerations enum Tree<T> { case Empty case Leaf(T) case Node(Tree,

    Tree) ! func depth() -> Int { func _depth<T>(t: Tree<T>) -> 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) } }
  11. Collections • Array, Dictionary, String (contains Char) • Collections are

    structs • Implicitly bridged to Cocoa collection types
  12. Collections func filter<S : Sequence>(…) -> Bool) -> FilterSequenceView<S> !

    func reverse<C : Collection …>(source: C) -> ReverseView<C> Some of operations are lazy evaluated
  13. Collections func filter<S : Sequence>(…) -> Bool) -> FilterSequenceView<S> !

    func reverse<C : Collection …>(source: C) -> ReverseView<C> Some of operations are lazy evaluated
  14. Built-in immutability var b = 3 b += 1 !

    let a = 3 a += 1 // error
  15. Dictionary immutability let d = ["key0": 0] ! d["key"] =

    3 //error d.updateValue(1, forKey: "key1") //error
  16. Array immutability let c = [1, 2, 3] ! c[0]

    = 3 // success c.append(5) // fail
  17. 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
  18. 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 }
  19. What Swift is missing • Preprocessor • Exceptions • Access

    control * • KVO, KVC • Compiler attributes (platforms, deprecations, etc.) • performSelector: is unavailable
  20. 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
  21. Objective-C bridging • NSArray < - > Array • NSDictionary

    < - > Dictionary • NSNumber - > Int, Double, Float
  22. Objective-C bridging func convertPoint(point: CGPoint, toWindow window: UIWindow!) -> CGPoint

    - (CGPoint)convertPoint:(CGPoint)point toWindow: (UIWindow *)window
  23. Objective-C bridging • All object types are mapped as implicitly

    unwrapped optionals (T!) • All ‘id’ types are mapped as ‘AnyObject’
  24. Swift internals • Swift objects are Obj-c objects • Implicit

    root class ‘SwiftObject’ • Ivars type encoding is stored separately • Method’s vtable • Name mangling
  25. Name mangling class Foo { func bar() -> Bool {

    return false } } _TFC9test3Foo3barfS0_FT_Sb Swift keeps function metadata encoded in function symbols
  26. Performance • 10-100 x slower than C++ (-O0) • 10

    x slower than C++ (-O3) • 1 x as C++ (-Ofast)*
  27. Cross-platform code #if os(iOS) typealias View = UView #else typealias

    View = NSView #endif ! class MyControl : View { }
  28. Pattern matching let point = (0, 1) ! if point.0

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

    { case (0...1, 0...1): println("I") … }
  30. 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.") }
  31. 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
  32. 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.")
  33. 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.")
  34. Implicit type conversion struct Box<T> { let _value : T

    init (_ value: T) { _value = value } } ! let boxedInt = Box(1) //Box<Int>
  35. Implicit type conversion extension Box { @conversion func __conversion() ->

    T { return _value } } ! ! foo(boxedInt) //success
  36. Implicit type conversion • allows any type to be ‘nil’

    (which has NilType) • allows toll-free-bridging with Cocoa types
  37. 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
  38. 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<UInt64>) -> CInt;
  39. Scripting and REPL • xcrun swift - launches REPL •

    xcrun -i ‘file.swift’ - executes script
  40. Where can I swift? • BDD Testing framework: Quick! •

    Reactive programming: RXSwift • Model mapping: Crust • Handy JSON processing: SwiftyJSON
  41. 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