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
0
670
これでよくわかる!Swiftのオプショナル
iOS開発会議 in beez渋谷 47回目に発表した資料です。
Sato Takeshi
February 28, 2016
Tweet
Share
More Decks by Sato Takeshi
See All by Sato Takeshi
まさかのバグ!SwiftUIプレビューでハマった国際化対応の落とし穴
satotakeshi
0
380
Swift愛好会 の 思い出
satotakeshi
0
120
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3k
Meet passkeys
satotakeshi
2
400
What's new in Vision
satotakeshi
0
2.2k
Swift Concurrency入門
satotakeshi
11
5.5k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
450
Xcodegenを個人アプリに導入
satotakeshi
3
870
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.2k
Other Decks in Technology
See All in Technology
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
410
AIエージェントに必要なのはデータではなく文脈だった/ai-agent-context-graph-mybest
jonnojun
1
250
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
2.6k
AIが実装する時代、人間は仕様と検証を設計する
gotalab555
1
290
1,000 にも届く AWS Organizations 組織のポリシー運用をちゃんとしたい、という話
kazzpapa3
0
160
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
6
1.7k
ブロックテーマ、WordPress でウェブサイトをつくるということ / 2026.02.07 Gifu WordPress Meetup
torounit
0
200
GitHub Issue Templates + Coding Agentで簡単みんなでIaC/Easy IaC for Everyone with GitHub Issue Templates + Coding Agent
aeonpeople
1
260
プロダクト成長を支える開発基盤とスケールに伴う課題
yuu26
4
1.4k
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
130
AIエージェントを開発しよう!-AgentCore活用の勘所-
yukiogawa
0
190
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
770
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
110
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
350
Designing for Timeless Needs
cassininazir
0
130
Fireside Chat
paigeccino
41
3.8k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
117
110k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Deep Space Network (abreviated)
tonyrice
0
64
Into the Great Unknown - MozCon
thekraken
40
2.3k
Code Review Best Practice
trishagee
74
20k
The Spectacular Lies of Maps
axbom
PRO
1
530
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