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
これでよくわかる!Swiftのオプショナル
Search
Sato Takeshi
February 28, 2016
Technology
680
0
Share
これでよくわかる!Swiftのオプショナル
iOS開発会議 in beez渋谷 47回目に発表した資料です。
Sato Takeshi
February 28, 2016
More Decks by Sato Takeshi
See All by Sato Takeshi
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
410
Swift愛好会 の 思い出
satotakeshi
0
140
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3.1k
Meet passkeys
satotakeshi
2
420
What's new in Vision
satotakeshi
0
2.4k
Swift Concurrency入門
satotakeshi
11
5.6k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
470
Xcodegenを個人アプリに導入
satotakeshi
3
920
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.2k
Other Decks in Technology
See All in Technology
"スキルファースト"で作る、AIの自走環境
subroh0508
1
690
コーディングAIが導くリスクベースド探索的テストの実践
lycorptech_jp
PRO
1
340
LLM時代のリファクタリング戦略_AIエージェントによる段階的・安全なTS移行方法
play_inc
0
140
Python開発環境にハーネス適用を検討する
yuuka51
1
470
TypeScriptエンジニアのためのWASMランタイム入門:AssemblyScriptから理解するメモリの実態(ayano)
ayanoyuki
0
110
CloudFront VPCオリジンとVPC Latticeサービスの内部ALBをマルチアカウントで一元利用しよう
duelist2020jp
5
180
RubyでRuby拡張を書いたらRubyより35倍速になったってどういうこと??
kazuho
3
570
TypeScript の型で副作用の実行順序を制御する
yanaemon
2
180
ルール・ロール・ツールを創る / Creating Rules, Roles and Tools
ks91
PRO
0
150
Agentic AI時代における メルカリのAIガバナンスとガードレール実装
naoichihara
14
11k
Splunk MCPサーバの利活用事例 ーKINTOテクノロジーズの取り組み
kintotechdev
1
240
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
0
290
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
3.4M
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
260
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
330
Mind Mapping
helmedeiros
PRO
1
200
How STYLIGHT went responsive
nonsquared
100
6.1k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
290
The SEO Collaboration Effect
kristinabergwall1
1
450
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Transcript
ʲே׆ʳ J04։ൃձٞ JOCFF[ौ୩ ճ ݄ ࠤ౻߶࢜
ࣗݾհ ʲ໊લʳ ࠤ౻߶࢜ ʲݞॻʳ ίϯηϓτͮ͘Γ͔Β૬ஊͰ͖ΔΤϯδχΞɻ ʲ͓ࣄʳ ࡢ݄ʹಠཱɻ લडୗ*5اۀͰΠϯϑϥͷอकӡ༻ۀ ࠓ༗ݶձࣾΧΠΧΠͰJ04ΞϓϦ࡞ ʲͰ͖Δ͜ͱʳ
SVCZ J04 BQBUDI MJOVY αʔόʔपΓʣ 5XJMJP ʲϦϦʔεΞϓϦʳ :VNF)PTIJ
4XJGUΛ։ൃͯͯ͠ 9DPEF͕ Λ ͔ͬͯʹೖΕͯ͘ΕΔ
9DPEFͷ͞ΕΔ͕··ʹ ͢ͷ͕ؾ࣋ͪѱ͍
4XJGUͷΦϓγϣφϧܕ Λཧͯ͠ ͳΜͱͳ͘ Λ͚ͭΔͷΛ Ί͍ͨ ɾТɾʆ
0CKFDU$Ͱͷ։ൃ ࣮ߦதͰͳ͍ͱ͔Βͳ͍όάΛ͏͔ͬΓ࡞ͬͪΌ͏ - (IBAction)crash:(UIButton *)sender { NSArray *array = [NSArray
array]; //Ϋϥογϡͤ͞Δ NSLog(@"%@", array[0]); }
ΞϓϦམͪͨʔ
ͦͷΤϥʔ 4XJGUͷΦϓγϣφϧܕͳΒ ࣄલʹݟ͚ͭΒΕΔ͔
4XJGUͷΦϓγϣφϧͰΨʔυ ੩తղੳͰΤϥʔʹͳΓͦ͏ͳͱ͜Ζ͕ผͰ͖Δ ˠજࡏతͳόάΛऔΓআ͖͍͢ʂ @IBAction func crash(sender: UIButton) { var array
: Array<String>? print(array?[0]) }
ͦΜͳ4XJGUͷΦϓγϣφϧܕ ͱͬͱྑ͘ͳΓ͍ͨ ɾ㱼ɾ
4XJGUͷΦϓγϣφϧܕ ·ͱΊ
0QUJPOBMܕͱʁ 0QUJPOBMܕOJMͷೖΛڐ͢ ඇPQUJPOBMܕOJMͷೖΛڐ͞ͳ͍ 0CKFDUJWF$ʹΦϒδΣΫτʹ͔͠OJMͳ͔ͬͨɻ ߏମɺ$ݴޠͷܕɺྻڍܕʹOJM͕ͳ͍ʣ TXJGUͲΜͳܕΦϓγϣφϧ͑Δ
0QUJPOBMܕએݴ var a: Int? var b: Optional<Int> // Int?ɹͱಉ͡ҙຯ enum
Optional<T> : Reflectable, NilLiteralConvertible { case None // nil ʹ૬͢Δ case Some(T) // T ܕʢૉͷܕʣͷ͕ೖΔʢInt ܕ String ܕͷͳͲʣ } 0QUJPOBM5FOVNܕͰఆٛ
0QUJPOBMܕએݴ͢ΔͱOJM͕ೖ͍͍ͬͯ var a: Int? a = nil //->nil͕ೖͬͯେৎ var b:
Int // ඇ optional ܕ b = nil // -> Nil cannot be assigned to type 'Int' ඇPQUJPOBMܕʹOJMΛೖ͠Α͏ͱ͢ΔͱɺίϯύΠϥΤϥʔ͕ൃੜ͢Δɻ 0QUJPOBMܕͷॳظOJM
0QUJPOBMܕͱඇ0QUJPOBMܕผͷܕ var unoptionalInt: Int = 1 print(unoptionalInt + 2) //
-> 3 var optionalInt : Int? = 1 print(optionalInt + 2) //Value of optional type 'Int?' not unwrapped; 0QUJPOBMܕΛ͏ʹΞϯϥοϓ͕ඞཁ
Ξϯϥοϓͷํ๏ w 'PSDFEVOXSBQQJOH w 0QUJPOBMDIBJOJOH w 0QUJPOBMCJOEJOH w ൺֱԋࢉࢠ w
*NQMJDJUMZ6OXSBQQFE0QUJPOBMܕͰએݴ͢Δ
'PSDFEVOXSBQQJOH var optionalInt : Int? = 1 print(optionalInt! + 2)
0QUJPOBMܕͷมͷޙΖʹʮʯΛ͚ͭΔ OJMͩͬͨΒϥϯλΠϜΤϥʔ
0QUJPOBMDIBJOJOH class Room { var adress : String = "ौ୩۠"
} class Person { var room : Room? } var aperson = Person() aperson.room?.adress = "ࠇ۠" aperson.room = Room() print(aperson.room?.adress) ʮ ʯΛͬͯΞϯϥοϓ͢Δ͜ͱ ΞϯϥοϓΛͨ͠ޙʹɺ࠷ऴతͳΓΛPQUJPOBMܕʹϥοϓͯ͠ ͔Βฦ͢ɻ
0QUJPOBM#JOEJOH if let adress = aperson.room?.adress{ print(adress) }else{ print("ॅॴ͕ొ͞Ε͍ͯ·ͤΜ") }
while let adress = aperson.room?.adress{ print(adress) break } JGXIJMFจͷ݅ࣜͰએݴ͞ΕɺPQUJPOBMܕͷมΛೖ͞Εͨ มɺඇPQUJPOBMܕʹͳΔɻ ͜ΕΛʮPQUJPOBMCJOEJOHʯͱݴ͏
ൺֱԋࢉࢠ var wrappedInt: Int? = 1 // Optional ܕ print(wrappedInt
== 1) // -> true print(wrappedInt >= 1) // -> true print(wrappedInt > 1) // -> false print(wrappedInt <= 1) // -> true print(wrappedInt < 1) // -> false print(wrappedInt != 1) // -> false wrappedInt = nil print(wrappedInt == 1) // -> false ൺֱԋࢉࢠΛ͏ͱɺPQUJPOBMܕͷม͕ࣗಈతʹΞϯϥοϓ͞Ε Δɻ OJM͕ೖͬͯΤϥʔʹͳΒͳ͍
*NQMJDJUMZ6OXSBQQFE0QUJPOBMܕͰએݴ /**implicitly unwrapped optional*/ var assumedString: String! = "An implicitly
unwrapped optional string." let implicitString: String = assumedString // no need for an exclamation mark” print(implicitString) /*ΦϓγϣφϧόΠϯσΟϯάͰ͖Δ*/ if let definiteString = assumedString { print(definiteString) } ࣗಈతʹΞϯϥοϓ͞ΕΔPQUJPOBMܕ ʮʯͰએݴ͢Δ
*NQMJDJUMZ6OXSBQQFE0QUJPOBMܕͰએݴ var implicityInt: Int! var implicityInt2: ImplicitlyUnwrappedOptional<Int> // Int! ͱಉ͡ҙຯ
ʮʯ*NQMJDJUMZ6OXSBQQFE0QUJPOBM5ͷγϯλοΫεγϡΨʔɻ *NQMJDJUMZ6OXSBQQFE0QUJPOBM5FOVNܕͰఆٛ͞Ε͍ͯΔ enum ImplicitlyUnwrappedOptional<T> : Reflectable, NilLiteralConvertible { case None // nil ʹ૬͢Δ case Some(T) // T ܕʢૉͷܕʣͷ͕ೖΔʢInt ܕ String ܕͷ ͳͲʣ }
·ͱΊ એݴ࣌ ࣮ߦ࣌ 0QUJPOBMܕ 0QUJPOBMDIBJOJOH *NQMJDJUMZ 6OXSBQQFE 0QUJPOBMܕ 'PSDFEVOXSBQQJOH
αϯϓϧίʔυ IUUQTHJTUHJUIVCDPN4BUP5BLFTIJ9FFCDGCFBDDF
ࢀߟ63- 5IF4XJGU1SPHSBNNJOH-BOHVBHF 4XJGU IUUQTJUVOFTBQQMFDPNKQCPPLTXJGUQSPHSBNNJOH MBOHVBHFJE NU OVMMࢀরͷߟҊԯυϧ୯Ґͷաͪʁ IUUQEFWFMPQFSTTSBEKQTUPSZOVMM &'&"&"&
&&"&"'&& &"#&%&#%%&"& &&&"&'#$'
ࢀߟ63- <4XJGU>4XJGUͷPQUJPOBMWBMVFͷศར͞ʮ ʯͱʮʯͰΑΓݎ࿚ͳ ίʔυ IUUQRJJUBDPNOPSJJUFNTBGBDDGGCED <4XJGU>0QUJPOBMܕʹ͍ͭͯͷ·ͱΊ7FS IUUQRJJUBDPNDPUSQFQFJUFNTDDBBGG 4XJGUͷΦϓγϣφϧνΣʔϯʢPQUJPOBMDIBJOJOHʣ IUUQCMPHLJUPLPDPNFOUSZ ΦϓγϣφϧܕɻʙͳΜͱͳ͚͘Δ
໓ IUUQXXXTMJEFTIBSFOFUIBTFHBXBUPNPLJTT