Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Secret Swift tour
Search
Yuka Ezura
March 01, 2018
Programming
3.1k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Secret Swift tour
2018/3/1
try! Swift Conference
Yuka Ezura
March 01, 2018
More Decks by Yuka Ezura
See All by Yuka Ezura
Mastering share sheet preview
ezura
4
1.5k
SF Symbols
ezura
9
1.5k
気遣いの iOS プログラミング
ezura
11
3.8k
Swift Album ver.4.1
ezura
3
1.6k
Swift と Kotlin
ezura
4
3k
哲学とSwiftの発表
ezura
5
670
アプリが動いたその先へ (iOS アプリ開発編)
ezura
1
1.2k
Blending Kotlin's culture into Swift
ezura
1
1.4k
Re: エラーと警告でコードをデザインする
ezura
2
1.1k
Other Decks in Programming
See All in Programming
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
180
Vue Fes Japan の “作る側”に関わってみて
naokihaba
1
180
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
200
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
140
[2026-10-09]一枚の布で作らなくてもいい。 信頼性は「パッチワーク」で紡がれる~既存の運用と新しい可能性をつなぎ合わせてきたCREの話~
tosite
0
110
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
190
Domain-Driven Transformation
hschwentner
2
2.3k
パスワード再設定メールのURLについて知っておこう
uyuki234
0
170
AmebaブログはKMPから卒業します
kmars0605
0
220
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
Featured
See All Featured
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Designing for Performance
lara
612
70k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
310
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Balancing Empowerment & Direction
lara
6
1.3k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.5k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
570
Designing Powerful Visuals for Engaging Learning
tmiket
1
610
Designing Experiences People Love
moore
143
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!!