Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Secret Swift tour
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuka Ezura
March 01, 2018
Programming
7
3k
Secret Swift tour
2018/3/1
try! Swift Conference
Yuka Ezura
March 01, 2018
Tweet
Share
More Decks by Yuka Ezura
See All by Yuka Ezura
Mastering share sheet preview
ezura
4
1.4k
SF Symbols
ezura
9
1.4k
気遣いの iOS プログラミング
ezura
11
3.7k
Swift Album ver.4.1
ezura
3
1.5k
Swift と Kotlin
ezura
4
2.9k
哲学とSwiftの発表
ezura
5
620
アプリが動いたその先へ (iOS アプリ開発編)
ezura
1
1.1k
Blending Kotlin's culture into Swift
ezura
1
1.3k
Re: エラーと警告でコードをデザインする
ezura
2
1k
Other Decks in Programming
See All in Programming
AI時代の認知負荷との向き合い方
optfit
0
170
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
CSC307 Lecture 06
javiergs
PRO
0
690
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
CSC307 Lecture 02
javiergs
PRO
1
780
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
230
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
750
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
430
Building the Perfect Custom Keyboard
takai
2
690
AI: The stuff that nobody shows you
jnunemaker
PRO
2
270
Crafting Experiences
bethany
1
52
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
350
The World Runs on Bad Software
bkeepers
PRO
72
12k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
160
A designer walks into a library…
pauljervisheath
210
24k
Transcript
Secret Swift tour 2018/3/1 try! Swift Conference Yuka Ezura
var myVariable = 42 myVariable = 50
let r = ( ) Void var myVariable = 42
myVariable = 50
obj?.myVariable = 50
(obj?.myVariable = 50) Optional<Void>
(obj?.myVariable = 50) .map { /* do something */ }
! error: Value of optional type 'Int?' not unwrapped; obj?.myVariable
+ 50
infix operator ⭐ func ⭐ (left: Int, right: Int) ->
Int { return left + right }aaaaaaa
! error: Value of optional type 'Int?' not unwrapped; obj?.myVariable
⭐ 5 infix operator ⭐ func ⭐ (left: Int, right: Int) -> Int { return left + right }aaaaaaa
infix operator ⭐ func ⭐ (left: Int, right: Int) ->
Int { return left + right }aaaaaaa
precedencegroup FoldedIntoOptionalChaining { assignment: true } :FoldedIntoOptionalChaining infix operator ⭐
func ⭐ (left: Int, right: Int) -> Int { return left + right }aaaaaaa
obj?.myVariable ⭐ 5 // => Optional<Int> 1 ⭐ 5 //
=> Int
let myVariable: Int = /* ?? */
let myVariable: Int = { while(true) {} }()
! error: Cannot convert value of type 'Never' to specified
type 'Int' let naver: Never = unsafeBitCast((), to: Never.self) let myVariable: Int = naver
let myVariable: Int = { while(true) {} }()
(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))
(closure_expr type='() -> Int' location=sample.swift:1:23 range=[sample.swift:1:23 - line:3:1] discriminator=0 let
myVariable: Int = { while(true) {} }()
let _: Int = { preconditionFailure() }() let _: Void
= { fatalError() }() let _: Never = { while(true) {} }()
class SomeClass { lazy var v: Int = { preconditionFailure("Variable
'\(#function)' used before being initialized") }()
class SomeClass { var v: Int! lazy var v: Int
= { preconditionFailure("Variable '\(#function)' used before being initialized") }()
Closure
let _: (Int) -> Int = { $0 + 1
}
func f(x: Int...) -> String { … } let _:
(Int...) -> String = f
struct SomeType { func f(x: Int) -> String { …
} } let _: (Int) -> String = SomeType().f let _: (SomeType) -> (Int) -> String = SomeType.f
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)
let _: (Int, Int) -> (Int) = (+) let _:
(inout Int, Int) -> () = (+=)
enum Page { case settings case externalSite(URL) let _: (URL)
-> Page = Page.externalSite }
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) }
[1.1, 3.2 ,3.5].map(round) [1.1, 3.2 ,3.5].sorted(by: <) ["www.ezura.me", ""].flatMap(URL.init)
inout
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
static func +=(lhs: inout Self, rhs: Self) var x =
1 // x: 1 x += 1 // x: 2 inout
! error: Escaping closures can only capture inout parameters explicitly
by value func f(_ arg: inout String) -> () -> () { return { print(arg) } }
func f(_ arg: inout String) { arg = "" arg
= "" } var testString = "" { didSet { print("changed: \(testString)") } } f(&testString) changed:
change to “" change to “" func f(_ arg: inout
String) var testString "" "" "" "" ""
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)
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:
change to “" change to “" func f(_ arg: inout
String) var testString "" "" ""
func f(_ arg: inout String) inout change to “" change
to “" var testString "" "" "" "" "" ""
inout return defer
defer execute after all other code in the scope
x++, ++x or neither? /* ??? */ func ++(x: inout
Int) -> Int { defer { x += 1 } return x }
postfix func ++(x: inout Int) -> Int { defer {
x += 1 } return x } x++
func f() { let v: String defer { print(v) }
v = "init value" }
func f() { let v: String defer { print(v) }
v = "init value" }
class SomeType { var v: String { didSet { …
} } init() { defer { v = " in defer" } v = "" v = "" } }
deinit { defer { v = "goodbye in defer" }
changeV() _ = { v = "goodbye in block" }() }
Swift Tour = (obj?.myVariable = 50) .map { /* …
*/ } { while(true) {} }() let _: (inout Int, Int) -> () = (+=) let _: (URL) -> Enum = Enum.case Closure
inout func f(_ arg: inout String) -> () -> ()
{ return { print(arg) } } copy-in copy-out / Optimized inout defer return
defer init() { defer { v = " in defer"
} v = " initialize" } deinit { v = "goodbye " defer { v = "goodbye in defer" } }
Swift Tour myVariable = 50 obj?.myVariable = 50 return Closure
defer didSet inout enum Never init, deinit
Thank you for listening!!