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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
AgentCoreとHuman in the Loop
har1101
5
230
2026年 エンジニアリング自己学習法
yumechi
0
130
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
450
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
AI によるインシデント初動調査の自動化を行う AI インシデントコマンダーを作った話
azukiazusa1
1
710
CSC307 Lecture 07
javiergs
PRO
0
550
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
5
430
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
6k
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.5k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.1k
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
170
Building an army of robots
kneath
306
46k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
Context Engineering - Making Every Token Count
addyosmani
9
650
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
320
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Typedesign – Prime Four
hannesfritz
42
2.9k
We Are The Robots
honzajavorek
0
160
My Coaching Mixtape
mlcsv
0
47
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Docker and Python
trallard
47
3.7k
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() } }
ご清聴ありがとうございました!