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
48
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OptionalSwift
About Optional at Swift
Lee Geunil
January 30, 2017
Other Decks in Programming
See All in Programming
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
360
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
210
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
自作OSでスライド発表する
uyuki234
1
3.9k
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
320
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
390
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
590
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
3
1.6k
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
130
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
810
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
340
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
Making Projects Easy
brettharned
120
6.7k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Building the Perfect Custom Keyboard
takai
2
820
The Pragmatic Product Professional
lauravandoore
37
7.4k
How to make the Groovebox
asonas
2
2.3k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
190
Odyssey Design
rkendrick25
PRO
2
730
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
350
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() } }
ご清聴ありがとうございました!