Secret Swift tour

Secret Swift tour

2018/3/1
try! Swift Conference

6a55a7fb19c1fa78e86ddca7a69db088?s=128

Yuka Ezura

March 01, 2018
Tweet

Transcript

  1. 8.

    infix operator ⭐ func ⭐ (left: Int, right: Int) ->

    Int { return left + right }aaaaaaa
  2. 9.

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

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

    infix operator ⭐ func ⭐ (left: Int, right: Int) ->

    Int { return left + right }aaaaaaa
  4. 11.
  5. 15.

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

    type 'Int' let naver: Never = unsafeBitCast((),
 to: Never.self) let myVariable: Int = naver
  6. 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))
  7. 19.

    let _: Int = { preconditionFailure() }() let _: Void

    = { fatalError() }() let _: Never = { while(true) {} }()
  8. 20.

    class SomeClass { lazy var v: Int = { preconditionFailure("Variable

    '\(#function)' used before being initialized") }()
  9. 21.

    class SomeClass { var v: Int! lazy var v: Int

    = { preconditionFailure("Variable '\(#function)' used before being initialized") }()
  10. 22.
  11. 24.
  12. 25.

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

    } } let _: (Int) -> String = SomeType().f let _: (SomeType) -> (Int) -> String = SomeType.f
  13. 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)
  14. 27.

    let _: (Int, Int) -> (Int) = (+) let _:

    (inout Int, Int) -> () = (+=)
  15. 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) }
  16. 31.
  17. 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
  18. 33.
  19. 34.

    ! error: Escaping closures can only capture
 inout parameters explicitly

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

    func f(_ arg: inout String) { arg = "" arg

    = "" } var testString = "" { didSet { print("changed: \(testString)") } } f(&testString) changed:
  21. 36.

    change to “" change to “" func f(_ arg: inout

    String) var testString "" "" "" "" ""
  22. 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)
  23. 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:
  24. 39.

    change to “" change to “" func f(_ arg: inout

    String) var testString "" "" ""
  25. 40.

    func f(_ arg: inout String) inout change to “" change

    to “" var testString "" "" "" "" "" ""
  26. 43.

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

    Int) -> Int { defer { x += 1 } return x }
  27. 47.

    class SomeType { var v: String { didSet { …

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

    deinit { defer { v = "goodbye in defer" }

    changeV() _ = { v = "goodbye in block" }() }
  29. 49.

    Swift Tour = (obj?.myVariable = 50) .map { /* …

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

    inout func f(_ arg: inout String) -> () -> ()

    { return { print(arg) } } copy-in copy-out / Optimized inout defer return
  31. 51.

    defer init() { defer { v = " in defer"

    } v = " initialize" } deinit { v = "goodbye " defer { v = "goodbye in defer" } }
  32. 52.

    Swift Tour myVariable = 50 obj?.myVariable = 50 return Closure

    defer didSet inout enum Never init, deinit