SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
糖衣構文なしで
Swi$のオプショナルを
使うとどうなるか?
2016年1月9日
藤本尚邦 / Cocoa勉強会(関東) #76
1
自己紹介
• 藤本尚邦 (@%isa)
• h+ps://github.com/%isa
• フリーランスプログラマー
• 主な作品: RubyCocoa, Swi=yLayout
• Mac開発歴、薄く長く約25年
• iOS開発歴、約1年
2
Agenda
• オプショナルおさらい
• 糖衣構文なしでオプショナル
• オプショナル使いこなしの注意点
• まとめ
3
オプショナルおさらい
普通の型に"?"または"!"の1文字を付けて型宣言す
るとオプショナルになります。見た目はたった1文
字の違いですが、普通の型とオプショナル型はまっ
たくの別物です。
var absolutelyInt: Int // 普通の型
var maybeInt: Int? // オプショナル型
var probablyInt: Int! // 暗黙のオプショナル型
4
オプショナルおさらい
オプショナルはおおよそ以下のように定義された普
通の enum です1
:
enum Optional<Wrapped> {
case None
case Some(Wrapped)
}
1
この発表で不要な情報は省いています
5
オプショナルおさらい
オプショナルが他のenumで定義された型と違うのは
豊富な糖衣構文2
を持っている。この一点です。
var maybeArray: [Int]? // Optional Type
var probablyArray: [Int]! // Implicitly Unwrapped Optional Type
if let array = maybeArray { ... } else { ... } // Optional Binding
let x = maybeArray?.count // Optional Chaining
let x = maybeArray! // Forced Unwrapping
let x = probablyArray.count // Implicitly Forced Unwrapping
let x = maybeArray ?? [1,2,3] // Nil Coalescing Operator
let x = someObject as? [Int] // Type Cast Operator
let x = someObject as! [Int] // Forced Type Cast Operator
2
英語では Syntax Sugar あるいは Syntac-c Sugar
6
糖衣構文なしでオプショナル
• 変数の宣言
• Op$onal Binding
• Op$onal Chaining
• Forced Unwrapping
• Nil Coalescing Operator
7
変数の宣言
var maybeInt: Int?
var maybeArray: [Int]?
糖衣構文なしだと
var maybeInt: Optional<Int>
var maybeArray: Optional<Array<Int>>
8
Op#onal Binding
if let array = maybeArray {
IF-CLAUSE
} else {
ELSE-CLAUSE
}
糖衣構文なしだと
switch maybeArray {
case .Some(let array):
IF-CLAUSE
case .None:
ELSE-CLAUSE
}
9
Op#onal Chaining
let x = maybeArray?.count // Optional Chaining
糖衣構文なしだと
let x = ({ Void -> Optional<Int> in
switch maybeArray {
case .None: return .None
case .Some(let array): return array.count
}
})()
10
Forced Unwrapping
let x = maybeArray! // Forced Unwrapping
糖衣構文なしだと
let x = ({ Void -> Int in
switch maybeArray {
case .None: fatalError("unexpectedly found nil ...")
case .Some(let array): return array
}
})()
11
Nil Coalescing Operator
let x = maybeArray ?? [1,2,3] // Nil Coalescing Operator
糖衣構文なしだと
let x = ({ (arg:[Int]) -> [Int] in
switch maybeArray {
case .None: return arg
case .Some(let array): return array
}
})([1, 2, 3])
12
オプショナル使いこなしの注意点
• "?"付きで型宣言するのが基本
• "!"付き型宣言は明確な理由がなければ使わない
• 強制アンラップ・キャストは、値がnilならバグの
ときのみ使う
• "?"や"??"を積極的に使うとコードの可読性が増す
if let delegate = delegate { delegate.someMethod() } // 冗長
delegate?.someMethod() // 簡潔・可読性良し
13
まとめ
• 普通の型とオプショナル型は見た目以上に異なる
• オプショナルはenumで定義された単なる型
• Swi%プログラミングではオプショナルが重要
• 糖衣構文なしでのオプショナルのプログラムは地獄
• だからたくさん糖衣構文があるんだよ
• オプショナルをきちんと理解して良いSwi%プログラム
を書こう
14
参考文献
• The Swi) Programming Language (Swi) 2.1)
h8ps://developer.apple.com/library/ios/
documentaDon/Swi)/Conceptual/
Swi)ProgrammingLanguage/
15
Thank you!2016年1月9日
藤本尚邦 / Cocoa勉強会(関東) #76
16

Mais conteúdo relacionado

Destaque

図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)
図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)
図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)kumo2010
 
HiroshimaR6_Introduction
HiroshimaR6_IntroductionHiroshimaR6_Introduction
HiroshimaR6_IntroductionSAKAUE, Tatsuya
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosTomohiro Kumagai
 
採用LT「まだお祈りデプロイで消耗してるの?」
採用LT「まだお祈りデプロイで消耗してるの?」採用LT「まだお祈りデプロイで消耗してるの?」
採用LT「まだお祈りデプロイで消耗してるの?」Takayuki Fukumoto
 
TRIZの講義・一時間目 発明原理+α
TRIZの講義・一時間目 発明原理+αTRIZの講義・一時間目 発明原理+α
TRIZの講義・一時間目 発明原理+αRikie Ishii
 
初心者のための、デザインのはじめの一歩
初心者のための、デザインのはじめの一歩初心者のための、デザインのはじめの一歩
初心者のための、デザインのはじめの一歩okataku95
 
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるかShiroyagi Corporation
 
なぜステマがネットで騒動になるのか
なぜステマがネットで騒動になるのかなぜステマがネットで騒動になるのか
なぜステマがネットで騒動になるのかMotohiko Tokuriki
 
やっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツやっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツRyosuke Yamazaki
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_introNobuhiro Sue
 
新潟県村上市Facebook連続3回セミナーその2in山北商工会
新潟県村上市Facebook連続3回セミナーその2in山北商工会新潟県村上市Facebook連続3回セミナーその2in山北商工会
新潟県村上市Facebook連続3回セミナーその2in山北商工会新潟コンサルタント横田秀珠
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたことSuzuki Masayuki
 
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522Kazuki Iwai
 
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編Yosuke YASUDA
 
Ideawork tools workshop_2013311
Ideawork tools workshop_2013311Ideawork tools workshop_2013311
Ideawork tools workshop_2013311Rikie Ishii
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活をRyunosuke SATO
 

Destaque (20)

図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)
図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)
図解でわかる Microsoft Office Live Meeting 2007 利用ガイド (Office 2010+Windows 7/Vista)
 
HiRoshimaR3_IntroR
HiRoshimaR3_IntroRHiRoshimaR3_IntroR
HiRoshimaR3_IntroR
 
HiroshimaR6_Introduction
HiroshimaR6_IntroductionHiroshimaR6_Introduction
HiroshimaR6_Introduction
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
採用LT「まだお祈りデプロイで消耗してるの?」
採用LT「まだお祈りデプロイで消耗してるの?」採用LT「まだお祈りデプロイで消耗してるの?」
採用LT「まだお祈りデプロイで消耗してるの?」
 
TRIZの講義・一時間目 発明原理+α
TRIZの講義・一時間目 発明原理+αTRIZの講義・一時間目 発明原理+α
TRIZの講義・一時間目 発明原理+α
 
初心者のための、デザインのはじめの一歩
初心者のための、デザインのはじめの一歩初心者のための、デザインのはじめの一歩
初心者のための、デザインのはじめの一歩
 
分析サンプル_ラーメン店販促施策立案のための来店客調査
分析サンプル_ラーメン店販促施策立案のための来店客調査分析サンプル_ラーメン店販促施策立案のための来店客調査
分析サンプル_ラーメン店販促施策立案のための来店客調査
 
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか
【19-D-1】人間と機械学習のはざま:どこまでアルゴリズムに任せるか
 
なぜステマがネットで騒動になるのか
なぜステマがネットで騒動になるのかなぜステマがネットで騒動になるのか
なぜステマがネットで騒動になるのか
 
やっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツやっとわかったタイピングスピード向上のコツ
やっとわかったタイピングスピード向上のコツ
 
Serverspec at hbstudy #45
Serverspec at hbstudy #45Serverspec at hbstudy #45
Serverspec at hbstudy #45
 
Presen ラーメン産業展
Presen ラーメン産業展Presen ラーメン産業展
Presen ラーメン産業展
 
Jjug 20140430 gradle_intro
Jjug 20140430 gradle_introJjug 20140430 gradle_intro
Jjug 20140430 gradle_intro
 
新潟県村上市Facebook連続3回セミナーその2in山北商工会
新潟県村上市Facebook連続3回セミナーその2in山北商工会新潟県村上市Facebook連続3回セミナーその2in山北商工会
新潟県村上市Facebook連続3回セミナーその2in山北商工会
 
自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと自分よりも技術力の高い会社に入社して感じたこと
自分よりも技術力の高い会社に入社して感じたこと
 
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522
LIG's DIRECTION school 2016 初級コース03 スタッフとのコミュニケーションからディレクションを設計する_160522
 
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編
ゲーム理論とマーケットデザイン入門 --- マーケットデザイン編
 
Ideawork tools workshop_2013311
Ideawork tools workshop_2013311Ideawork tools workshop_2013311
Ideawork tools workshop_2013311
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活を
 

Swift Optional without Syntax Sugar