Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
380
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
3.4k
TUIライブラリつくってみた / i-just-make-TUI-library
kazto
1
290
Level up your Gemini CLI - D&D Style!
palladius
1
150
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
780
CSC509 Lecture 14
javiergs
PRO
0
210
DSPy Meetup Tokyo #1 - はじめてのDSPy
masahiro_nishimi
1
130
dotfiles 式年遷宮 令和最新版
masawada
1
490
CSC305 Lecture 15
javiergs
PRO
0
220
Google Antigravity and Vibe Coding: Agentic Development Guide
mickey_kubo
2
120
データファイルをAWSのDWHサービスに格納する / 20251115jawsug-tochigi
kasacchiful
2
100
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
510
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
KATA
mclloyd
PRO
32
15k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Facilitating Awesome Meetings
lara
57
6.6k
Six Lessons from altMBA
skipperchong
29
4.1k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Faster Mobile Websites
deanohume
310
31k
What's in a price? How to price your products and services
michaelherold
246
12k
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() } }
ご清聴ありがとうございました!