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

839 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
839
On SlideShare
0
From Embeds
0
Number of Embeds
43
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Денис Лебедев, 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как

×