Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【いまさら聞けない】SwiftのOptionalってなに?
Search
FromAtom
June 23, 2017
Technology
3.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【いまさら聞けない】SwiftのOptionalってなに?
社内の勉強会で話しました
FromAtom
June 23, 2017
More Decks by FromAtom
See All by FromAtom
「UIは英語なのにアプリ内リンクは日本語だ!」を防ぐコツ / pixiv App Night 2024-10-24
fromatom
0
150
『SwiftUIならiOS, macOSの両方で動くエディタアプリが簡単に作れる』 と思ったら大間違いだよ! / pixiv App Night 2024-01-25
fromatom
1
650
君だけのGFMエディタを作ろう! / iOSDC Japan 2023
fromatom
0
2.4k
サポートiOSバージョンを定期的にあげる仕組みづくり / iOSDC Japan 2022
fromatom
1
4.5k
僕たちが 『Appのプライバシーに関する質問への回答』 そして『ATT』に対応するまでの物語 / iOSDC Japan 2021
fromatom
1
4.9k
やってみよう! iOSDCデザインスポンサー! / iOSDC Japan 2021 LT
fromatom
2
1.6k
デバッグメニューのメンテナンスが大変だったので、専用アプリを作りました。 / iOSDC Japan 2020
fromatom
9
7.7k
スクリーン配信機能の実装が大変だったので知見をお伝えします / iOSDC2019
fromatom
7
15k
🎉 esa 生誕5周年記念パーティー(\( ⁰⊖⁰)/) 🎉 / esa the 5th anniversary
fromatom
1
4.7k
Other Decks in Technology
See All in Technology
IoTデバイスを繋げるプロトコルMatterをAndroidで使用する方法
harutiro
0
140
SREでアラート疲れを 解決しよう!
kairim0
1
220
夫婦で子育てするための育児標準化
codmoninc
PRO
0
150
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
690
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
宣言型部分更新は何を解決しどこへ向かうのか
shuta13
0
310
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
210
生成AIと進める探索的データ分析(2026.10.03 第122回Tokyo.R勉強会)
tatamiya
2
1.5k
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
370
生成AIで高い生産性を求められて、 悩み、乗り越えた話
mot_techtalk
2
160
ファミコンでPHPを動かす / PHP on the Famicom side b
tomzoh
0
140
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
680
Featured
See All Featured
The SEO identity crisis: Don't let AI make you average
varn
0
580
The Curious Case for Waylosing
cassininazir
1
560
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
It's Worth the Effort
3n
188
29k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
550
Code Reviewing Like a Champion
maltzj
529
40k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Designing for humans not robots
tammielis
254
26k
So, you think you're a good person
axbom
PRO
2
2.2k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
400
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
390
Transcript
【 いまさら聞けない】 Swift の Optional ってなに? 2017/06/23 @fromatom
iOS 開発つまづきポイント Optional Delegate Autolayout ProvisioningPro fi le 突然ぶっ壊れる Xcode
突然ぶっ壊れる Xcode 突然ぶっ壊れる Xcode
iOS 開発つまづきポイント Optional Delegate Autolayout ProvisioningPro fi le 突然ぶっ壊れる Xcode
突然ぶっ壊れる Xcode 突然ぶっ壊れる Xcode
はじめに Swift の Optional が複雑( に見える) のは、 同じ記号(! と ?
) が違う意 味で使われているから たとえば、 下記で使われる ! と ? はすべて意味が違います var a: Int? = 1 var b: Int! = 2 let c: Int = a! + 10 self?.collectionView?.reloadData()
目次 1. Optional 2. Implicitly Unwrapped Optional 3. Optional Chaining
1. Optional
Swift での nil とは nil について知らないと Optional を理解できない Swift のnil
は値・ 式の評価結果がない( もしくはエラー) を表す Swift1.x 系では do-catch と throw が無かったんや Swift にはポインタがないので厳密には空ポインタではない
Swift での nil とは nil を通常の値と同じように触ると虚無に飲み込まれクラッシュする 自然界にnil はないので触ったら死ぬ 他の言語と違って0 やfalse
として解釈されない 虚無に型はない nil をハンドリングするために導入されたのがOptional
Optional Int Type まずは Int で考えます Int は整数型なので整数ではない nil は代入できない
nil を代入したい場合はInt? という Optional Int Type を使う var a: Int = 0 var b: Int? = 0 a = nil // コンパイルエラー になる b = nil // 代入できる
Optional Int Type var a: Int = 0 var b:
Int? = 0 var c: Optional<Int> = 0 // 上と同じ Int? はOptional<Int> のシンタックスシュガー Optional<T> というクラス( 正確には enum ) があり、Generics で様々 な型を入れられる つまり、 Int と Int? は別物 ← 超重要 型が違うので同じようには使えない ← 当たり前だよね
Optional Int Type を Int として使いたい Int? はInt ではないのでInt として扱えない
Unwrap することで使えるようになる ここで "!" が登場します Xcode に言われるがまま修正すると入ってくる謎の "!" "!" を使って Unwrap することを Force Unwrap と言います
Force Unwrap var optionalValue: Int? = 2000 var a: Int
= optionalValue + 20 // 型が違うのでコンパイルエラー になる var b: Int = optionalValue! + 20 // 2020 になる optionalValue! の "!" で Int を取り出している もしoptionalValue の中身がnil だったら実行時クラッシュ
条件判定 実行時クラッシュすると困るので条件判定をします var optionalValue: Int? = 2000 if optionalValue !=
nil { print(optionalValue!) // ここでは "!" が必要 } if optionalValue == 1000 { // "!" を書かなくても良い print("1000 だよ") } else if optionalValue == 2000 { print("2000 だよ") // これが表示される }
Optional Binding 毎回 "!" 書くのは大変 if 文の then 節では nil
チェックした変数を使いたいことが多い そこで Optional Binding です var optionalValue: Int? = 2000 if let value = optionalValue { // if-let で1 つの構文 print(value) //"!" が要らない } else { print("nil だったらしいよ") //optionalValue がnil なら実行される }
Optional Binding 複数の値を Optional Binding することもできます var optionalA: Int? =
1 var optionalB: Int? = 2 if let a = optionalA, let b = optionalB { // optionalA, optionalB が両方nil ではないときにくる print(a + b) // 3 が表示される }
条件式との組み合わせ optional binding した値を条件式で使える var optionalValue: Int? = 2000 if
let value = optionalValue, value > 100 { print("100 より大きいよ") }
Nil Coalescing Operator ある Optional Type の変数がnil だった時に、 他の定数を使いたいときに 便利なやつ
let value: Int = optionalValue ?? 100 optionalValue がnil なら100 が代入されます。 便利だけど多用すると右 に長くなっていくので注意。 let value: Int = optA ?? optB ?? optC ?? 100 ※Bool 値を見ているわけではないので注意
2. Implicitly Unwrapped Optional
Implicitly Unwrapped Optional 参照したら勝手に Unwrap してくれる Optional Type var a:
Int = 0 var b: Int! = 0 a = nil // コンパイルエラー になる b = nil // 代入できる Int! はImplicitlyUnwrappedOptional<Int> のシンタックスシュガー var b: Int! = 0 var c: ImplicitlyUnwrappedOptional<Int> = 0 // 上と同じ
Implicitly Unwrapped Optional "!" で Unwrap しなくてもよい var a: Int!
= 0 var b: Int = a + 20 // "!" マー クがなくてもアクセスできる! a = nil // a にnil をいれてみる var c: Int = a + 20 // 実行時にクラッシュする クラスの生成直後は nil だけど、1 度設定されたら nil になりえない変数に 使う。StoryBoard との関連(IBOutlet ) でよく使います。
3. Optional Chaining
Optional Chaining Method Chaining をする際、 途中で Optional な要素がある時に利用す る。 self?.collectionView?.reloadData()
self?.navigationController?.setNavigationBarHidden(false, animated: true)
Optional Chaining こういう class があり、3 世代前の名前を知りたい時 class Human { var
ancestor: Human? var name: String } こうやれば取れるけど、 どこかで nil が入ったらクラッシュ print(human.ancestor!.ancestor!.ancestor!.name)
Optional Chaining これでもいけるけど、 if let a = human.ancestor, let b
= a.ancestor, let c = b.ancestor { print(c.name) } Optional Chaining を使えばこう書ける if let name = human.ancestor?.ancestor?.ancestor?.name { print(name) }
メソッドも実行できる self?.collectionView?.reloadData() self?.navigationController?.setNavigationBarHidden(false, animated: true) 代入もできる // 3 世代前の先祖がいたら置き換える human.ancestor?.ancestor?.ancestor?
= newAncestor
ちょっと便利な Optional Chaining テク Void を返すメソッドを Optional Chaining で実行するとOptional<Void> を
返すようになる。 if self?.collectionView?.reloadData() != nil { //reloadData() が呼ばれたら実行される } if (human.ancestor?.ancestor?.ancestor? = newAncestor) != nil { // 代入が成功したら実行される }
まとめ これで Swift コー ド上で使われる様々 な意味の "!" と "?" の違いが(
ふわ っと) 分かったと思います。 var a: Int? = 1 // Optional var b: Int! = 2 // Implicitly Unwrapped Optional var c: Int = a! + 10 // Force Unwrap self?.collectionView?.reloadData() // Optional Chaining
参考文献 1. 詳解 Swift 改訂版 2016 年 1 月 1
日 初版第一刷発行 http://amzn.asia/eeKqCsH Swift3 系はこちら:http://amzn.asia/4IXtxem 2. どこよりも分かりやすい Swift の "?" と "!" http://qiita.com/maiki055/items/b24378a3707bd35a31a8