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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
130
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
170
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
180
ぼくの開発環境2026
yuzneri
0
160
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6k
今から始めるClaude Code超入門
448jp
8
8.6k
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
640
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
200
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
510
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
190
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
120
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
Featured
See All Featured
Navigating Team Friction
lara
192
16k
RailsConf 2023
tenderlove
30
1.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Ruling the World: When Life Gets Gamed
codingconduct
0
140
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
The SEO identity crisis: Don't let AI make you average
varn
0
66
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.6k
Designing for Timeless Needs
cassininazir
0
130
The Spectacular Lies of Maps
axbom
PRO
1
520
How to Talk to Developers About Accessibility
jct
2
130
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Building Applications with DynamoDB
mza
96
6.9k
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() } }
ご清聴ありがとうございました!