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
680
これでよくわかる!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
400
Swift愛好会 の 思い出
satotakeshi
0
130
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3.1k
Meet passkeys
satotakeshi
2
410
What's new in Vision
satotakeshi
0
2.3k
Swift Concurrency入門
satotakeshi
11
5.5k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
470
Xcodegenを個人アプリに導入
satotakeshi
3
900
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.2k
Other Decks in Technology
See All in Technology
Astro Islandsの 内部実装を 「日本で一番わかりやすく」 ざっくり解説!
knj
0
290
Change Calendarで今はOK?を仕組みにする
tommy0124
1
110
開発チームとQAエンジニアの新しい協業モデル -年末調整開発チームで実践する【QAリード施策】-
qa
0
310
来期の評価で変えようと思っていること 〜AI時代に変わること・変わらないこと〜
estie
0
100
イベントで大活躍する電子ペーパー名札を作る(その2) 〜 M5PaperとM5PaperS3 〜 / IoTLT @ JLCPCB オープンハードカンファレンス
you
PRO
0
210
Phase11_戦略的AI経営
overflowinc
0
1.6k
Blue/Green Deployment を用いた PostgreSQL のメジャーバージョンアップ
kkato1
0
130
欠陥分析(ODC分析)における生成AIの活用プロセスと実践事例 / 20260320 Suguru Ishii & Naoki Yamakoshi & Mayu Yoshizawa
shift_evolve
PRO
0
400
VSCode中心だった自分がターミナル沼に入門した話
sanogemaru
0
700
DMBOKを使ってレバレジーズのデータマネジメントを評価した
leveragestech
0
270
俺の/私の最強アーキテクチャ決定戦開催 ― チームで新しいアーキテクチャに適合していくために / 20260322 Naoki Takahashi
shift_evolve
PRO
1
450
Phase06_ClaudeCode実践
overflowinc
0
2.1k
Featured
See All Featured
Everyday Curiosity
cassininazir
0
180
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
64
52k
Color Theory Basics | Prateek | Gurzu
gurzu
0
260
Un-Boring Meetings
codingconduct
0
240
4 Signs Your Business is Dying
shpigford
187
22k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
330
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
140
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
160
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
460
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.4k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
160
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