Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Денис Лебедев, Swift

959 views

Published on

Published in: Technology
  • Be the first to comment

Денис Лебедев, Swift

  1. 1. Swift Denis Lebedev, iOS @ Yandex
  2. 2. Agenda • Introduction • Objective-C bridging • Good-to-know features • “Where can I Swift?”
  3. 3. Swift Chris Lattner, Swift creator
  4. 4. Swift • Multi-paradigm • Static, inferred typing • Bridged with Objective-C • No pointers
  5. 5. –Someone at WWDC Keynote It’s like “Objective-C without C.”
  6. 6. Swift features • Namespacing* • Generic classes & functions • Named/default parameters • Functions are first class citizens • Optional types
  7. 7. Optionals • Used in situations where value may be absent • Alternative for obj-c nil passing • works with any type
  8. 8. Optionals - (NSInteger)indexOfObject:(id)object;
  9. 9. Optionals func indexOf(object: AnyObject) -> Int?
  10. 10. Forced unwrapping let result :Int? = indexOf(bar); let s = String(result) //error let s = String(result!)
  11. 11. Optional binding if let r = result { let s = String(r) } else { // r is nil }
  12. 12. Classes, structs, enums • Classes passed by reference, structs - by value • Using a struct has no runtime penalty • All scalars and even Bool are structs
  13. 13. Collections • Array, Dictionary • Collections are structs • Implicitly bridged to Cocoa collection types
  14. 14. Built-in immutability var b = 3 b += 1 let a = 3 a += 1 // error
  15. 15. Dictionary immutability let d = ["key0": 0] d["key"] = 3 //error d.updateValue(1, forKey: "key1") //error
  16. 16. Array immutability let c = [1, 2, 3] c[0] = 3 // success c.append(5) // fail
  17. 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. 18. Extensions • extends any named type (struct, enum, class) • structures code
  19. 19. 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 }
  20. 20. What Swift is missing • Preprocessor • Exceptions • Access control * • KVO, KVC • Compiler attributes (platforms, deprecations, etc.) • performSelector: is unavailable
  21. 21. 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
  22. 22. Objective-C bridging • NSArray < - > Array • NSDictionary < - > Dictionary • NSNumber - > Int, Double, Float
  23. 23. Objective-C bridging @objc class Foo { init (bar: String) { /*...*/ } }
  24. 24. Objective-C bridging @objc(objc_Foo) class Foo { @objc(initWithBar:) init (bar: String) { /*...*/ } }
  25. 25. Objective-C bridging Foo *foo = [[Foo alloc] initWithBar:@"Bar"];
  26. 26. Objective-C bridging func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath
  27. 27. Objective-C bridging • All object types are mapped as implicitly unwrapped optionals (T!) • All ‘id’ types are mapped as ‘AnyObject’
  28. 28. Swift internals • Swift objects are Obj-c objects • Implicit root class ‘SwiftObject’ • Ivars type encoding is stored separately • Method’s vtable
  29. 29. Name mangling • Swift keeps function metadata encoded in function symbols
  30. 30. Name mangling class Foo { func bar() -> Bool { return false } } _TFC9test3Foo3barfS0_FT_Sb
  31. 31. Compiler features • Profile-guided optimization (‘off’ by default) • Loop vectorisation (‘on’ by default from Xcode 6) • High-level language-specific optimizer and IR before LLVM (‘xcrun swift t.swift -O -emit-sil')
  32. 32. Performance • 10-100 x slower than C++ (-O0) • 10 x slower than C++ (-O3) • 1 x as C++ (-Ofast)*
  33. 33. Performance • Swift is still in beta • Unoptimized calls of retain/release in loops
  34. 34. Pattern matching let point = (0, 1) if point.0 == 0 && point.1 == 0 { println("Point is at the origin") } else if point.0 >= 0 && point.0 <= 1 && point.1 >= 0 && point.1 <= 1 { println("I") } ...
  35. 35. 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.") }
  36. 36. 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
  37. 37. 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.")
  38. 38. Cross-platform code #if os(iOS) typealias View = UView #else typealias View = NSView #endif class MyControl : View { }
  39. 39. 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.")
  40. 40. Implicit type conversion struct Box<T> { let _value : T init (_ value: T) { _value = value } } let value = Box(1) value + 3 //error
  41. 41. Implicit type conversion extension Box { @conversion func __conversion() -> T { return value } } let value = Box(3 + 3) value + 3 //9
  42. 42. Implicit type conversion • allows any type to be ‘nil’ (which has NilType) • allows toll-free-bridging with Cocoa types
  43. 43. 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
  44. 44. Direct call of C functions @asmname - attribute that allows to provide a Swift interface for C functions @asmname("my_c_func") func my_c_func(UInt64, CMutablePointer<UInt64>) -> CInt;
  45. 45. Scripting and REPL • xcrun swift - launches REPL • xcrun -i ‘file.swift’ - executes script
  46. 46. Where can I swift? • BDD Testing framework: Quick • Reactive programming: RXSwift • Model mapping: Crust • Handy JSON processing: SwiftyJSON
  47. 47. Thx! @delebedev
  48. 48. 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как

×