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
660
これでよくわかる!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
330
Swift愛好会 の 思い出
satotakeshi
0
98
Xcode 15, Swift 5.9で変わる開発体験
satotakeshi
3
3k
Meet passkeys
satotakeshi
2
370
What's new in Vision
satotakeshi
0
1.8k
Swift Concurrency入門
satotakeshi
11
5.3k
複数端末のつらさを乗り越えてiOS UITestを実行
satotakeshi
1
430
Xcodegenを個人アプリに導入
satotakeshi
3
810
SwiftUIで作る開閉式メニュー
satotakeshi
2
3.1k
Other Decks in Technology
See All in Technology
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
190
Generative AI Japan 第一回生成AI実践研究会「AI駆動開発の現在地──ブレイクスルーの鍵を握るのはデータ領域」
shisyu_gaku
0
330
react-callを使ってダイヤログをいろんなとこで再利用しよう!
shinaps
2
260
2つのフロントエンドと状態管理
mixi_engineers
PRO
3
120
サラリーマンの小遣いで作るtoCサービス - Cloudflare Workersでスケールする開発戦略
shinaps
2
470
MagicPod導入から半年、オープンロジQAチームで実際にやったこと
tjoko
0
110
今日から始めるAWSセキュリティ対策 3ステップでわかる実践ガイド
yoshidatakeshi1994
0
110
大「個人開発サービス」時代に僕たちはどう生きるか
sotarok
20
10k
Snowflake×dbtを用いたテレシーのデータ基盤のこれまでとこれから
sagara
0
120
dbt開発 with Claude Codeのためのガードレール設計
10xinc
2
1.3k
RSCの時代にReactとフレームワークの境界を探る
uhyo
10
3.5k
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
230
Featured
See All Featured
A designer walks into a library…
pauljervisheath
207
24k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
Done Done
chrislema
185
16k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
850
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Writing Fast Ruby
sferik
628
62k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Optimizing for Happiness
mojombo
379
70k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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