SlideShare a Scribd company logo
1 of 46
はじめてオプショナル
第18回Swiftビギナーズ勉強会
Futatsugi Takuya
目次
自己紹介
ようこそオプショナル
くわしくオプショナル
Appleオプショナル
わたしのオプショナル
目次
自己紹介
「にき」じゃないです
新卒SE。iOS開発歴3ヶ月
業務都合によりXcode7, Swift2.3
ふたつぎの情報
「にき」じゃないです
iOS開発歴3ヶ月
業務都合によりXcode7, Swift2.3
アニメが好きです
ふたつぎの情報
http://koenokatachi-movie.com/sp/
アクセス日:2016年10月9日
登壇の経緯
https://www.amazon.co.jp/dp/4822251551
アクセス日:2016年10月29日
目次
ようこそオプショナル
https://www.amazon.co.jp/dp/4797384514
アクセス日:2016年10月28日
オプショナルとは
nil
何もないことを表す特別な値
Optional型
値が存在しないかもしれない状態を持つ型
西磨翁『本気ではじめるiPhoneアプリ作り』p.58
オプショナルは
アンラップして使う
var value: String?
value = "こんにちは"
print(value) // Optional("こんにちは")
if let value = value { /** アンラップ処理 **/
print(value) // こんにちは
}
西磨翁『本気ではじめるiPhoneアプリ作り』p.58
if let value = value
という書き方推奨
if let unwrappedValue = value { /** アンラップ処理 **/
print(unwrappedValue) // こんにちは
// 別名をつけると間違った呼び出しで不具合が生じる
print(value) // Optional("こんにちは")
}
西磨翁『本気ではじめるiPhoneアプリ作り』p.58
黒帯本から学んだ
オプショナルの扱い方
nilかチェックして強制アンラップ(!)
if let でnilでない値を取り出す
if value != nil {
// value! = someValue
}
if let value = value {
// value = someValue
}
あくまで発表者個人の感想です
勉強と開発の日々・・・
黒帯本の限界?
あくまで発表者個人の感想です
黒帯本の限界?
「オプショナルを扱う際は
必ずしもnilチェックしなくてもよい」
あくまで発表者個人の感想です
「オプショナルを扱う際は
必ずしもnilチェックしなくてもよい」
(コードレビューにて上長から)
nilチェックなしでは
エラーになるのでは?
目次
くわしくオプショナル
http://qiita.com/lovee/items/555a5b76097347aa2367
アクセス日:2016年10月28日
極力Forced Unwrapping(!)を避ける
Optional Bindingや
Optional Chainingを使う
Optional BindingとはIf letのことらしい
https://www.amazon.co.jp/dp/4797386258/
アクセス日:2016年10月28日
Optional Binding
var canBeModified: Bool?
if let value = value,
var canBeModified = canBeModified
where canBeModified {
// do something
}
??
var str: String = value ?? ""
Optional Binding
var canBeModified: Bool?
if let value = value,
var canBeModified = canBeModified
where canBeModified {
// do something
}
??
var str: String = value ?? ""
Optional Chaining
オプショナル型のインスタンスを?でつないで
中のプロパティにアクセス
Optional Binding
var canBeModified: Bool?
if let value = value,
var canBeModified = canBeModified
where canBeModified {
// do something
}
勉強と開発の日々・・・
目次
Appleオプショナル
https://itunes.apple.com/jp/book/swift-programming-language/id881256329?m
発表者が読んでいるのはSwift 3 Edition
アクセス日:2016年10月28日
Optionalとは
抜粋:Apple Inc. “The Swift Programming Language (Swift 3)”。iBooks
Language Guide > The Basics
“Optionals say either
“there is a value, and it equals x”
or “there isn’t a value at all”.”
xという値が存在する
値が存在しない
または
Int
例:0, 2, -9, 456(整数値)
Int?
例:0, 2, -9, 456(整数値)または nil
Int
例:0, 2, -9, 456(整数値)
Int?
例:0, 2, -9, 456(整数値)または nil
整数値
(Intの値)
値が存在しない
(nil)
Int nil
Optional Bindingとは
o check for a value inside an optional, and to extract tha
抜粋:Apple Inc. “The Swift Programming Language (Swift 3)”。 iBooks
Language Guide > The Basics > Optionals > Optional Binding
オプショナルの値が存在するかチェックする
値が存在するなら定数や変数に取り出す
if節・while節で使われる
抜粋:Apple Inc. “The Swift Programming Language (Swift 3)”。 iBooks
Language Guide > The Basics > Optionals > Optional Binding
Optional Chainingとは
“If the value before the ? is nil,
everything after the ? is ignored
and the value of the whole expression is nil.
Otherwise, the optional value is unwrapped,
and everything after the ? acts on the unwrapped value.”
Swift Programming Language (Swift 3)”。 iBooks Welcome to Swift > A Swift Tour
?をつけたオプショナルの値がnilなら
?以降を無視し、式全体の値はnilとなる
“If the value before the ? is nil,
everything after the ? is ignored
and the value of the whole expression is nil.
Otherwise, the optional value is unwrapped,
and everything after the ? acts on the unwrapped value.”
Swift Programming Language (Swift 3)”。 iBooks Welcome to Swift > A Swift Tour
?をつけたオプショナルの値が存在するなら
?以降ではアンラップした値を扱う
class OptionalChainingSample {
var value: String {
get { return _value }
set {
print("setter called")
_value = newValue
print("setter finished")
}
}
private var _value: String = "やあ"
}
var aSample: OptionalChainingSample?
print(aSample == nil) // true
print(aSample?.value) // nil
aSample?.value = "こんにちは" /* 何もprintされない
つまりsetが呼ばれていない */
print(aSample) // nil
aSampleがnilなのでvalueへの代入は無視
?をつけたオプショナルの値がnilなら
?以降を無視し、式全体の値はnilとなる
aSample = OptionalChainingSample()
print(aSample == nil) // false
print(aSample?.value) // Optional("やあ")
aSample?.value = "こんにちは" /* setter called
setter finished
がprintされる*/
print(aSample?.value) // Optional("こんにちは")
aSampleが値を持つのでvalueに代入可能
?をつけたオプショナルの値が存在するなら
?以降ではアンラップした値を扱う
イメージは大きな箱に箱を入れる
// Optional Chainingしなくてもよい
if let aSample = aSample {
aSample.value = "お疲れさまです"
print(aSample) // お疲れさまです
}
print(aSample) // Optional(お疲れさまです)
Optional Bindingでも可能
Optional Chainingでは行数が少なくなる
type-safe(型安全)
String?型をString型として
扱っていることを指摘している
目次
わたしのオプショナル
まとめ
オプショナルは封がされた箱
値の取り出し方の一つに
箱ごと別の箱に入れるのが
オプショナルバインディングがある
オプショナルチェイニング
ご清聴ありがとうございました
。

More Related Content

Featured

Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Featured (20)

PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
Unlocking the Power of ChatGPT and AI in Testing - A Real-World Look, present...
 
12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work12 Ways to Increase Your Influence at Work
12 Ways to Increase Your Influence at Work
 
ChatGPT webinar slides
ChatGPT webinar slidesChatGPT webinar slides
ChatGPT webinar slides
 
More than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike RoutesMore than Just Lines on a Map: Best Practices for U.S Bike Routes
More than Just Lines on a Map: Best Practices for U.S Bike Routes
 
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
Ride the Storm: Navigating Through Unstable Periods / Katerina Rudko (Belka G...
 
Barbie - Brand Strategy Presentation
Barbie - Brand Strategy PresentationBarbie - Brand Strategy Presentation
Barbie - Brand Strategy Presentation
 

はじめてオプショナル

Editor's Notes

  1. みなさまこんにちは。 ふたつぎと申します。 今回初登壇となります。 初学者から見たオプショナルについて発表させていただきます。 よろしくお願いします。
  2. 目次です。
  3. まず簡単に自己紹介します。 今回の勉強会のDoorkeeperページでも自己紹介しています。
  4. 重要な点として、漢数字の二にツリーの木と書くのですが、にきじゃないです。 大学ではプログラミングの基礎の基礎を学び、4月からSEとして働いています。 iOS開発には7月からアサインされましたが、 IDEを使ったことはなく、MVCのフレームワークもよくわからないという状態でした。 毎日8時間ほど取り組んでも苦にならないほどにはSwiftが好きです。 今回はXcode7,Swift2.3で発表させていただきます。
  5. Swiftも好きですが、アニメが好きです。 9月からは毎週映画館に『聲の形』を見に行ってリフレッシュしています。
  6. SOFT SKILLSという本を読みまして 人に教えることは自分の勉強になるという考えを知り、 その実践として今回発表いたします。 また、初学者でも発表可能という勉強会の方針にも背中を押されました。 この発表ではオプショナルはこう考えればいいという私の考え方まで発表しますが、誤りなどありましたらご指摘いただけますと大変ありがたいです。
  7. それでは、オプショナルとの出会いについてお話しします。
  8. 出会いはこちらのヤフー黒帯本でした。
  9. 黒帯本によると、 Swiftにはnilという何もないことを表す値があり、 オプショナルとは「値が存在しないかもしれない状態を持つ型」です。
  10. オプショナルはアンラップして使うと説明されていました。 valueをオプショナルStringとし、「こんにちは」を代入します。 アンラップ処理の部分で if let value = value の部分は最初に見たときはvalueにvalueを代入しているので、 よくわかりませんでした。
  11. 黒帯本では if let value = valueと代入の前後は同名の変数名を使うように説明されています。 別名をつけるとif節の中の間違った呼び出しが起こりうるからだそうです。 コンパイルエラーになるという理由ではなく、 人的エラーを防ぐという理由だったので正直納得できませんでしたが、 そういう決まりとして深く追求しないことにしました。
  12. という訳で、黒帯本からは2つの扱い方を学びました。 一つはオプショナルをnilかチェックして、nilでなければ強制アンラップする方法、 もう一つはif let value = value でnilでない値を取り出す方法です。
  13. オプショナルの扱い方2つをもとに業務に取り組みます。
  14. そんなある日、オプショナルについて壁にぶつかりました。
  15. コードレビューの際に、上長から致命的なエラーではないが、 オプショナルを扱うときは必ずしもnilかどうかチェックしなくてもいいと言われたのです。
  16. 先ほどの2つの方法しか知らなかったので、 どういうことかよくわかりませんでした。
  17. 例えば、オプショナルStringにStringをつなげようとすると Xcodeがエラーを出します。 コンパイルを通すためにはアンラップする必要があり、 実行時エラーを防ぐためにはnilかどうかチェックしてアンラップか if let文かのどちらかを使う必要があると考えていました。 つまり、nilかどうかのチェックはコンパイルを通すために必須と考えていたわけです。
  18. 壁を乗り超えるためオプショナルについてさらに解説を求めました。
  19. 勉強を初めて1.5ヶ月くらいに偶然見つけた 「ガチでSwiftでプログラム組んで1年経っての心得」というQiitaの記事から示唆を受けました。
  20. この記事にはオプショナルの扱い方として !を使ったアンラップは極力さけること、 オプショナルバインディングやオプショナルチェイニングを使うこと とありました。 黒帯本で知ったif let value = valueはオプショナルバインディングというらしいとこの記事から知りました。
  21. オプショナルバインディングやオプショナルチェイニングとは何かを学ぶため 詳解Swiftを紐解きました。
  22. まずオプショナルバインディングですが、if let 文のことです。 ただし、柔軟に使うことができ、複数のオプショナルから値を取り出したり、 whereで取り出した値を評価することができます。 このコードは2つのオプショナルvalueとcanBeModifiedの値を取り出した後、 BoolであるcanBeModifiedの値に応じてif節の中を実行します。
  23. 詳解Swiftでは??も学びました。 ??の左にあるオプショナルの値を取り出しますが、 nilの場合は??の右の値を返します。 これにより、強制アンラップせずにオプショナルStringの値をStringに代入できます。
  24. オプショナルチェイニングについては オプショナル型のインスタンスを?でつなぐものだと知りました。 例はこの後出します。
  25. こうして新たなオプショナルの扱い方を身につけ、業務に取り組みました。
  26. 続いて、ある程度オプショナルを使う経験を積んだ上で Appleの開発者向けドキュメントのオプショナルのところを見たところ 非常に分かりやすく感じましたので そちらを共有したいと思います。
  27. Appleの開発者向けドキュメントの中の The Swift Programming Languageは英語かつ膨大な量で手が出にくいかもしれませんが、 非常に分かりやすいです。
  28. 2つの状態を表します。 1つは値が存在する状態、もう一つは値が存在しない状態です。
  29. 例としてIntとオプショナルIntを考えます。 Intには整数値が入ります。整数値が入らないIntはありえません。
  30. オプショナルIntには、整数値が入っている場合の他に 整数値が入っていない場合があります。 整数値が入っていないことはnilで示されます。 これを読んでオプショナルは封がされた箱なのだと考えるようになりました。 箱を開けると、値が入っていることもあれば、値が入っていなくて空の場合もあります。
  31. if節やwhile節で使われ、次の2つの処理をセットで扱います。 1つはオプショナルの値が存在するかのチェックです。 値が存在する場合、続けてその値を取り出します。
  32. 箱であるオプショナルに値が入っている場合、 箱から値を取り出し、if節の中でその値を使って処理をします。 値が入っていない場合はif文の条件がfalseの場合のフローとなります。
  33. 例がなくわかりにくいと思いますので さらっといきます。
  34. オプショナルチェイニングの例のためにクラスを用意しました。 変数はvalueにはset節を用意しました。オプショナルチェイニングで値をセットしようとした時の挙動を見るためです。
  35. aSampleをOptionalChainingSampleオブジェクトまたはnilが入る変数とします。 aSampleは初めnilです。 オプショナルチェイニングでOptionalChainingSampleオブジェクトのプロパティvalueをget,setしようとしてもaSampleはnilなので無視されます。
  36. aSampleをOptionalChainingSampleオブジェクトとすると 今度はプロパティvalueをget,setできます。
  37. オプショナルチェイニングは値が入っているかによらず、オプショナルの箱ごと箱に入れオプショナルにするイメージです。 ?をつけることで連鎖させられるので、どんどん大きな箱に入れていき、入っている値を見るときは全部一度に開けるイメージです。
  38. OptionalChainingと同じことはOptionalBindingでもできます。 ?を使って連鎖させる書き方はわずか1行で済むというメリットがあります。
  39. ようやくエラーの意味もわかりました。
  40. 最後にオプショナルはこう考えればいいのではという提案です。
  41. オプショナルは封がされた箱 値が入っている場合もあれば入っていない場合もある。 オプショナルバインディングは値が入っているかチェックし