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
OptionalSwift
Search
Lee Geunil
January 30, 2017
Programming
0
47
OptionalSwift
About Optional at Swift
Lee Geunil
January 30, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
170
SourceGeneratorのススメ
htkym
0
190
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
660
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
250
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
6k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.3k
今から始めるClaude Code超入門
448jp
8
8.6k
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6k
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.5k
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
190
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Practical Orchestrator
shlominoach
191
11k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
200
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
240
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
150
Building an army of robots
kneath
306
46k
Transcript
”!” をほっとかない
Swift のオプショナルの話
自己紹介 Lee Geunil FutureScope -> OHAKO
アジェンダ Swift には ! と ? 沢山出てくる! オプショナルとは何か? なぜオプショナルが必要なのか? オプショナルはアンラップしないと使えない!
アンラップのやり方 まとめ
Swift には ! と ? 沢山出てくる! var bool: Bool? =
true var str: String! = "hoge" if !bool! { (str != nil) ? "true!" : "false!" } else { print(str?.uppercased() ?? "this is nil") }
Swift には ! と ? 沢山出てくる! var bool: Bool? =
true var str: String! = "hoge" if !bool! { (str != nil) ? "true!" : "false!" } else { print(str?.uppercased() ?? "this is nil") } Swift 初心者:
オプショナルとは何か? オプショナルとはnil を許容する型です。 型の最後に? を使って表します。 var hoge: String? = nil
// OK オプショナル型以外にnil は代入できません。 var hoge: String = nil // NG
オプショナルとは何か? Objective-C では普通にnil を代入出来る。 NSString *hoge = nil;
なぜオプショナルが必要なのか? Objective-C では普通にnil を代入出来る。 NSString *hoge = nil; label.text(hoge); //
落ちない nil の変数を実行しても落ちない。
なぜオプショナルが必要なのか? Objective-C では普通にnil を代入出来る。 NSString *hoge = nil; label.text(hoge); //
落ちない nil の変数を実行しても落ちない。 意図しないnil で重大なエラー になりかねない。
なぜオプショナルが必要なのか? Objective-C では普通にnil を代入出来る。 NSString *hoge = nil; label.text(hoge); //
落ちない nil の変数を実行しても落ちない。 意図しないnil で重大なエラー になりかねない。 if ( hoge != nil ) { // 要チェック label.text(hoge); }
なぜオプショナルが必要なのか? Objective-C では普通にnil を代入出来る。 NSString *hoge = nil; label.text(hoge); //
落ちない nil の変数を実行しても落ちない。 意図しないnil で重大なエラー になりかねない。 ちなみにjava の場合はNullPointerException で落ちる ※ コンパイルエラー にならない ※Java8 からはOptional がある
なぜオプショナルが必要なのか? Swift では変数にnil かどうかをオプショナルでわか るようになったので安全である。 var hoge: String? = nil
button.text = hoge // コンパイルエラー!! コンパイルエラー になるので、 テスト漏れやリリー ス する前にバグを発見出来るので安全!!
オプショナルはアンラップしないと使 えない! オプショナルを解除( Unwrap ) しないと変数を使う事が 出来ません。
オプショナルはアンラップしないと使 えない! オプショナルを解除( Unwrap ) しないと変数を使う事が 出来ません。 Optional 型で変数を包み込んでるからWrapping と言い
ます。
オプショナルはアンラップしないと使 えない! オプショナルを解除( Unwrap ) しないと変数を使う事が 出来ません。 Optional 型で変数を包み込んでるからWrapping と言い
ます。 var a: Int? = 1 print(a + 1) // error
オプショナルはアンラップしないと使 えない! オプショナルを解除( Unwrap ) しないと変数を使う事が 出来ません。 Optional 型で変数を包み込んでるからWrapping と言い
ます。 var a: Int? = 1 print(a + 1) // error アンラップする方法は色々 あります。
アンラップのやり方 Forced Unwrapping Optional Chaining Optional Binding 目的はオプショナル型の変数から値を取り出すこと!
アンラップのやり方 Forced Unwrapping ( 要注意) Optional Chaining( 手抜き) Optional Binding(
可能な限りこれを使う) 個人的な主観ですが・・・
Forced Unwrapping nil の場合 落ちます! var hoge: String? = nil
print(hoge!.uppercased())
Forced Unwrapping nil の場合 落ちます! var hoge: String? = nil
print(hoge!.uppercased()) 今回の”!” をほっとかないの意味は Forced Unwrapping の事です!
Forced Unwrapping nil の場合 落ちます! var hoge: String? = nil
print(hoge!.uppercased()) 今回の”!” をほっとかないの意味は Forced Unwrapping の事です! 確実にnil ではない場合以外でForced Unwrapping を使 ってはいけません。
Forced Unwrapping nil の場合 落ちます! var hoge: String? = nil
print(hoge!.uppercased()) 今回の”!” をほっとかないの意味は Forced Unwrapping の事です! 確実にnil ではない場合以外でForced Unwrapping を使 ってはいけません。 次に紹介するOptional Chaining を使いましょう!
Optional Chaining nil の場合でも落ちません var hoge: String? = nil print(hoge?.uppercased())
hoge がnil の場合処理を中断してくれます。
Optional Chaining nil の場合でも落ちません var hoge: String? = nil print(hoge?.uppercased())
hoge がnil の場合処理を中断してくれます。 気楽にアンラッピング出来て楽ですが、 nil の場合の処理が書けません。
Optional Chaining nil の場合でも落ちません var hoge: String? = nil print(hoge?.uppercased())
hoge がnil の場合処理を中断してくれます。 気楽にアンラッピング出来て楽ですが、 nil の場合の処理が書けません。 次に紹介する Optional Binding を使いましょう!
Optional Binding if let を使ったやり方 var hoge: String? = "Hello
World!" if let hoge = hoge { print(hoge) // Hello World! } else { print("This is nil") }
Optional Binding if let を使ったやり方 var hoge: String? = "Hello
World!" if let hoge = hoge { print(hoge) // Hello World! } else { print("This is nil") } 一度に複数記述出来る var hoge: String? = "Hello " var fuga: String? = "World!" if let hoge = hoge, let fuga = fuga { print(hoge + fuga) // Hello World! }
Optional Binding guard let を使ったやり方 var hoge: String? = "Hello
World!" guard let hoge = hoge else { print("This is nil") return } print(hoge) // Hello World!
Optional Binding guard let を使ったやり方 var hoge: String? = "Hello
World!" guard let hoge = hoge else { print("This is nil") return // return がない場合、 コンパイルエラー } print(hoge) // Hello World! return の記述が必須なので安全
Optional Binding guard let を使ったやり方 var hoge: String? = "Hello
World!" guard let hoge = hoge else { print("This is nil") return // return がない場合、 コンパイルエラー } print(hoge) // Hello World! return の記述が必須なので安全 guard の方が早期リター ン出来てネストを浅く出来て 良い。
まとめ nil の扱いを改めよう! Forced Unwrapping は落ちるので使わない! Optional Binding を使おう!
nil の扱いを改める参考記事 null 安全ではない言語は、 もはやレガシー 言語だ http://qiita.com/koher/items/e4835bd429b88809ab 33 null 参照の考案は10億ドル単位の過ち?
https://developers.srad.jp/story/09/03/05/0937219/
ご清聴ありがとうございました!
おまけ
オプショナルの実態とは? 実はオプショナルの? は Optinal<T> のシンタックスシュガー で var hoge: String? var
hoge: Optional<String> 上記2つは同じ意味です。
オプショナルの実態とは? 実はオプショナルの? は Optinal<T> のシンタックスシュガー で var hoge: String? var
hoge: Optional<String> 上記2つは同じ意味です。 さらに詳細はSwift の中身を見るとわかります。 ソー スコー ドはgithub にあります。 swift -> stdlib -> public -> core -> Optional.swift
オプショナルの実態はEnum である! public enum Optional<Wrapped> : ExpressibleByNilLiteral { case none
case some(Wrapped) }
オプショナルの実態はEnum である! この書き方は var hoge: String? = "Hello World!" var
age: Int? = nil つまり var hoge: Optional<String> = .some("Hello World!") var age: Optional<Int> = .none ということ。
オプショナルの実態はEnum である! Enum なのでSwitch 文でも判定出来る var hoge: String? = "Hello
World!" if let hoge = hoge { print(hoge) // Hello World! } else { print("unknown") } var hoge: Optional<String> = .some("Hello World!") switch hoge { case .some(let stringValue): return print(hoge) // Hello World! case .none: return print("unknown") }
おまけ2
オプショナルの?? 演算子 ?? は値が nil だった場合に後ろの値を使用する var hoge: String? =
nil print(hoge ?? "this is nil") // this is nil 三項演算子のシンタックスシュガー var hoge: String? = nil print(hoge != nil ? hoge : "this is nil")
オプショナルの?? 演算子の中身 public func ?? <T>(optional: T?, defaultValue: @autoclosure rethrows
-> T? { switch optional { case .some(let value): return value case .none: return try defaultValue() } }
ご清聴ありがとうございました!