Secret Swift tour

Secret Swift tour

2018/3/1
try! Swift Conference

6a55a7fb19c1fa78e86ddca7a69db088?s=128

Yuka Ezura

March 01, 2018
Tweet

Transcript

  1. Secret Swift tour 2018/3/1 try! Swift Conference Yuka Ezura

  2. var myVariable = 42 myVariable = 50

  3. let r = ( ) Void var myVariable = 42

    myVariable = 50
  4. obj?.myVariable = 50

  5. (obj?.myVariable = 50) Optional<Void>

  6. (obj?.myVariable = 50) .map { /* do something */ }

  7. ! error: Value of optional type 'Int?' not unwrapped; obj?.myVariable

    + 50
  8. infix operator ⭐ func ⭐ (left: Int, right: Int) ->

    Int { return left + right }aaaaaaa
  9. ! error: Value of optional type 'Int?' not unwrapped; obj?.myVariable

    ⭐ 5 infix operator ⭐ func ⭐ (left: Int, right: Int) -> Int { return left + right }aaaaaaa
  10. infix operator ⭐ func ⭐ (left: Int, right: Int) ->

    Int { return left + right }aaaaaaa
  11. precedencegroup FoldedIntoOptionalChaining { assignment: true } :FoldedIntoOptionalChaining infix operator ⭐

    func ⭐ (left: Int, right: Int) -> Int { return left + right }aaaaaaa
  12. obj?.myVariable ⭐ 5 // => Optional<Int> 1 ⭐ 5 //

    => Int
  13. let myVariable: Int = /* ?? */

  14. let myVariable: Int = { while(true) {} }()

  15. ! error: Cannot convert value of type 'Never' to specified

    type 'Int' let naver: Never = unsafeBitCast((),
 to: Never.self) let myVariable: Int = naver
  16. let myVariable: Int = { while(true) {} }()

  17. (source_file (top_level_code_decl (brace_stmt (pattern_binding_decl (pattern_typed type='Int' (pattern_named type='Int' 'myVariable') (type_ident

    (component id='Int' bind=Swift.(file).Int))) (call_expr type='Int' location=sample.swift:1:23 range=[sample.swift:1:23 - line:3:3] nothrow arg_labels= (closure_expr type='() -> Int' location=sample.swift:1:23 range=[sample.swift:1:23 - line:3:1] discriminator=0 (parameter_list) (brace_stmt (while_stmt (call_expr implicit type='Int1' location=sample.swift:2:10 range=[sample.swift:2:10 - line:2:15] nothrow arg_labels= (dot_syntax_call_expr implicit type='() -> Int1' location=sample.swift:2:10 range=[sample.swift:2:10 - line:2:15] nothrow (declref_expr implicit type='(Bool) -> () -> Int1' location=sample.swift:2:11 range=[sample.swift: 2:11 - line:2:11] decl=Swift.(file).Bool._getBuiltinLogicValue() function_ref=double) (paren_expr type='(Bool)' location=sample.swift:2:11 range=[sample.swift:2:10 - line:2:15] (call_expr implicit type='Bool' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] nothrow arg_labels=_builtinBooleanLiteral: (constructor_ref_call_expr implicit type='(Int1) -> Bool' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] nothrow (declref_expr implicit type='(Bool.Type) -> (Int1) -> Bool' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] decl=Swift.(file).Bool.init(_builtinBooleanLiteral:) function_ref=single) (type_expr implicit type='Bool.Type' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] typerepr='Bool')) (tuple_expr implicit type='(_builtinBooleanLiteral: Builtin.Int1)' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] names=_builtinBooleanLiteral (boolean_literal_expr type='Builtin.Int1' location=sample.swift:2:11 range=[sample.swift:2:11 - line:2:11] value=true))))) (tuple_expr implicit type='()')) (brace_stmt)))) (tuple_expr type='()' location=sample.swift:3:2 range=[sample.swift:3:2 - line:3:3]))) )) (var_decl "myVariable" type='Int' interface type='Int' access=internal let storage_kind=stored))
  18. (closure_expr type='() -> Int' location=sample.swift:1:23 range=[sample.swift:1:23 - line:3:1] discriminator=0 let

    myVariable: Int = { while(true) {} }()
  19. let _: Int = { preconditionFailure() }() let _: Void

    = { fatalError() }() let _: Never = { while(true) {} }()
  20. class SomeClass { lazy var v: Int = { preconditionFailure("Variable

    '\(#function)' used before being initialized") }()
  21. class SomeClass { var v: Int! lazy var v: Int

    = { preconditionFailure("Variable '\(#function)' used before being initialized") }()
  22. Closure

  23. let _: (Int) -> Int = { $0 + 1

    }
  24. func f(x: Int...) -> String { … } let _:

    (Int...) -> String = f
  25. struct SomeType { func f(x: Int) -> String { …

    } } let _: (Int) -> String = SomeType().f let _: (SomeType) -> (Int) -> String = SomeType.f
  26. enum Rank: Int { case ace = 1 case two,

    three, four, five, six, seven, eight, nine, ten case jack, queen, king } let _: (Int) -> Rank? = Rank.init init?(rawValue: Int)
  27. let _: (Int, Int) -> (Int) = (+) let _:

    (inout Int, Int) -> () = (+=)
  28. enum Page { case settings case externalSite(URL) let _: (URL)

    -> Page = Page.externalSite }
  29. static var settings: Page { return Page.settings } static func

    externalSite(_ url: URL) -> Page { return Page.externalSite(url) } let _: (URL) -> Page = Page.externalSite enum Page { case settings case externalSite(URL) }
  30. [1.1, 3.2 ,3.5].map(round) [1.1, 3.2 ,3.5].sorted(by: <) ["www.ezura.me", ""].flatMap(URL.init)

  31. inout

  32. let _: (Int...) -> String = f let _: (Int)

    -> String = SomeType().f let _: (SomeType) -> (Int) -> String = SomeType.f let _: (Int, Int) -> (Int) = (+) let _: (inout Int, Int) -> () = (+=) let _: (URL) -> Page = Page.externalSite inout
  33. static func +=(lhs: inout Self, rhs: Self) var x =

    1 // x: 1 x += 1 // x: 2 inout
  34. ! error: Escaping closures can only capture
 inout parameters explicitly

    by value func f(_ arg: inout String) -> () -> () { return { print(arg) } }
  35. func f(_ arg: inout String) { arg = "" arg

    = "" } var testString = "" { didSet { print("changed: \(testString)") } } f(&testString) changed:
  36. change to “" change to “" func f(_ arg: inout

    String) var testString "" "" "" "" ""
  37. current testString: changed: func f(_ arg: inout String) { arg

    = "" sleep(2) arg = "" } var testString = "" { didSet { print("changed: \(testString)") } } DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(1)) { print("current testString: \(testString)") } f(&testString)
  38. func f(_ arg: inout String) { arg = "" sleep(2)

    arg = "" } var testString = "" /* { didSet { print("changed: \(testString)") } } */ DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(1)) { print("current testString: \(testString)") } f(&testString) current testString:
  39. change to “" change to “" func f(_ arg: inout

    String) var testString "" "" ""
  40. func f(_ arg: inout String) inout change to “" change

    to “" var testString "" "" "" "" "" ""
  41. inout return defer

  42. defer execute after all other code in the scope

  43. x++, ++x or neither? /* ??? */ func ++(x: inout

    Int) -> Int { defer { x += 1 } return x }
  44. postfix func ++(x: inout Int) -> Int { defer {

    x += 1 } return x } x++
  45. func f() { let v: String defer { print(v) }

    v = "init value" }
  46. func f() { let v: String defer { print(v) }

    v = "init value" }
  47. class SomeType { var v: String { didSet { …

    } } init() { defer { v = " in defer" } v = "" v = "" } }
  48. deinit { defer { v = "goodbye in defer" }

    changeV() _ = { v = "goodbye in block" }() }
  49. Swift Tour = (obj?.myVariable = 50) .map { /* …

    */ } { while(true) {} }() let _: (inout Int, Int) -> () = (+=) let _: (URL) -> Enum = Enum.case Closure
  50. inout func f(_ arg: inout String) -> () -> ()

    { return { print(arg) } } copy-in copy-out / Optimized inout defer return
  51. defer init() { defer { v = " in defer"

    } v = " initialize" } deinit { v = "goodbye " defer { v = "goodbye in defer" } }
  52. Swift Tour myVariable = 50 obj?.myVariable = 50 return Closure

    defer didSet inout enum Never init, deinit
  53. Thank you for listening!!