Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Secret Swift tour

Secret Swift tour

2018/3/1
try! Swift Conference

Yuka Ezura

March 01, 2018
Tweet

More Decks by Yuka Ezura

Other Decks in Programming

Transcript

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

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

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

    Int { return left + right }aaaaaaa
  4. ! error: Cannot convert value of type 'Never' to specified

    type 'Int' let naver: Never = unsafeBitCast((),
 to: Never.self) let myVariable: Int = naver
  5. (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))
  6. let _: Int = { preconditionFailure() }() let _: Void

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

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

    = { preconditionFailure("Variable '\(#function)' used before being initialized") }()
  9. struct SomeType { func f(x: Int) -> String { …

    } } let _: (Int) -> String = SomeType().f let _: (SomeType) -> (Int) -> String = SomeType.f
  10. 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)
  11. let _: (Int, Int) -> (Int) = (+) let _:

    (inout Int, Int) -> () = (+=)
  12. 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) }
  13. 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
  14. ! error: Escaping closures can only capture
 inout parameters explicitly

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

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

    String) var testString "" "" "" "" ""
  17. 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)
  18. 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:
  19. change to “" change to “" func f(_ arg: inout

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

    to “" var testString "" "" "" "" "" ""
  21. x++, ++x or neither? /* ??? */ func ++(x: inout

    Int) -> Int { defer { x += 1 } return x }
  22. class SomeType { var v: String { didSet { …

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

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

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

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

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

    defer didSet inout enum Never init, deinit