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
Optional皆伝
Search
touyou
October 29, 2016
Programming
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Optional皆伝
http://qiita.com/koher/items/c6f446bad54442a28bf4
この記事を参考にSwiftのOptional型についてまとめさせていただきました。
touyou
October 29, 2016
More Decks by touyou
See All by touyou
Liquid GlassとApp Intents
touyou
0
1.6k
生成AI時代のコンポーネントライブラリの作り方
touyou
1
2.2k
生成AI活用プロダクトが目指してほしい未来
touyou
0
4.2k
メンター百物語 紡ぎ続けられる確かな情熱
touyou
0
720
これからの時代の『クリエイター』の生き方
touyou
0
120
しくじり先生〜とうようがLeaders7期生からL4S7期講師になるまでのプログラミング半生を振り返る
touyou
0
170
AWSサーバーレスが支える劇団ノーミーツのオンライン劇場ZA / AWS Dev Day Online 2021 C-5
touyou
0
5.4k
3年A組から学ぶ体験の作り方
touyou
0
2.4k
學問のすすめ
touyou
0
1.3k
Other Decks in Programming
See All in Programming
act1-costs.pdf
sumedhbala
0
240
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
500
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
150
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
410
初めてのKubernetes 本番運用でハマった話
oku053
0
130
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
230
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.9k
Claude Team Plan導入・ガイド
tk3fftk
0
220
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
840
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
GitHubCopilotCLIのスラッシュコマンドを自作してみる
htkym
0
100
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
55
12k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
A better future with KSS
kneath
240
18k
Why Our Code Smells
bkeepers
PRO
340
58k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
A designer walks into a library…
pauljervisheath
211
24k
Transcript
0QUJPOBMܕօ ˋ➬穈ה嚊䙀ד椚鍑ׅ0QUJPOBM㘗ˋ hUPVZPV
瑱搫דָׅ㉏겗דׅկ
⟃♴ך״ֲז儗ծ֮זזוֲ剅ֹתַׅ ˖ B*OU ָ֮הֹծBך⦼✳⛦׃ְկ׃ծBָOJMך㜥さכOJM䖤ְկ ˖ BSSBZ<*OU> ָ֮הֹծBSSBZך剑ⴱך銲稆《䖤׃ְկ׃ծBSSBZָOJMַծ 剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך㜥さכOJM䖤ְկؼٝز<*OU>כSTU *OU הְֲفٗػذ؍䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM鵤ׅկ
˖ Y%PVCMF ָ֮הֹծYך䎂倯呎鎘皾׃ְկ׃ծYָOJMתכ頾ך侧ך㜥 さכOJM䖤ְկזֶծTRSU㸜Ⰻח׃頾ך侧床ׅהOJM鵤ׅꟼ侧 TBGF4RSU%PVCMF%PVCMF ָ֮ךה׃ג罋ִג葺ְկ ˖ B*OU הC*OU ָ֮הֹծB C鎘皾׃ְկ׃ծBַCָOJMך㜥さחכ OJM䖤ְկ
걧ך晙ꥎד 罋ִגְֶגְֻׁկ
0QUJPOBM㘗ג ˖ )PHFכOJMָⰅזְ ˖ )PHFכ剑ⴱֽOJMָⰅ ˖ )PHF כOJMד)PHF㘗ך⦼ד⟣䠐ךة؎ىؚٝדⰅ
ָֿ♧菙涸ז铡僇דׅկ
דָׅծזׁ
ֽד0QUJPOBM㘗ָ ⴓַה劤䔲ח䙼גתַׅ
ֽד0QUJPOBM㘗 ⢪ְֿזׇגְה 劤䔲ח䙼גתַׅ
չכְպה瘶ִֿך֮ז
欥ְ
欥ֺׅ
0QUJPOBM㘗ծ噰ת׃׳
0QUJPOBM㘗噰לֿזֿהװ ˟ؿ؍ؙءّٝדׅկh傈劤ذٖؽ
ֿזֿהג ˟ؿ؍ؙءّٝדׅկh8BSOFS#SPT&OUFSUBJONFOU *OD
דֹתׇָ˘
החְְַֻדֹדׅ
縧ָֹꞿֻזת׃կ כׄתׅկ 劤颵涸ח0QUJPOBM㘗ג
Ұɺ0QUJPOBMܕϞφυͰ͋Δ
ְװְװ⟃חٌشسגזװי ˖ ֮岀ח䖞ג㹋鄲ׁ խBU.BQ䭯א㘗 ˖ ⯋ղꟼ侧㘗فؚٗٓىؚٝח խ״ֻ⢪嚊䙀 ˖ זַ䬄韋涸ד խ״ַֻזְֽו⤑ⵃ
ٌشسחאְג4XJGUד铡僇׃ג ˖ הְֲ鎸✲ָ2JJUBח֮תׅկ鑫׃ֻכ撑 ˖ 'PP5ָ如ך勴⟝弫ׅ儗ٌشسהㄎע ˖ ⴱ劍⻉ꟼ侧ָ֮ ˖ BU.BQהְֲًاحسא ˖
ٌشس弫ׅ ˖ ؿ؋ؙٝة٦ד֮
ٌشس ˖ 'PP Y BU.BQ G G Y ˖
GPPBU.BQ\'PP ^GPP ˖ GPPBU.BQ\G BU.BQ H ^GPPBU.BQ G BU.BQ H
ؿ؋ؙٝة٦ ˖ NBQהְֲًاحسא ˖ ؿ؋ؙٝة٦弫ׅ ˖ 䛎瘝ꟼ侧JEחꟼ׃גGPPNBQ JE JE GPP
˖ GPPNBQ\H G ^GPPNBQ G NBQ H
זחָ鎉ְְַה鎉ֲה)BTLFMM㷕ןת׃׳ֲկ暴חչׅ׀ְ)BTLFMMך׃ֻ㷕רֲպ כ鸐獥չׅ׀ְ)劤պהㄎלגֶٌشسזוָ♨㻝ח鍑铡ׁגְהְֲֿהד剣せז 劤דׅկ薉铂晛ד֮לطحزד搀俱ד铣ֿהדֹתׅկ㹋ꥷךהֿ⬁כת铣ⴖ גְזְךדַָٌׅشسֿתד椚鍑׃גְֽדכזְךדָׅꟼ侧㘗鎉铂 㷕עהְֲֿהכ4XJGUדꟼ侧㘗鎉铂שְ㹋鄲⢪ִ״ֲחזהְֲֿהד֮גծ ח״ג➙תד撕꧟Ⳣ椚ָ知患ח剅ֽ׃תׅկזח״3Y4XJGUזוד䪔גְ ךכ'VODUJPOBM3FBDUJWF1SPHSBNNJOH鸐獥'31הㄎלגֶꟼ侧㘗鎉铂ך暴 䗙㢳ֻ《Ⰵגְתׅկת4XJGUחכ0QUJPOBM㘗⟃㢩ח׳ֻ׳ֻٌشسחזג ְ㘗ָ㶷㖈ֿׅ⹈䓼ֿׅהכ4XJGUד״ٖكٕך넝ְ㹋鄲ָדֹהְֲ 挿דהג䕵חאךדכזְד׃׳ֲַկꞿղה铂ת׃ָאתזחָ鎉ְְַהְ
ֲה4XJGU⟃㢩ך暴חַֽꨄفؚٗٓىؚٝ鎉铂㷕עהְֲֿהכ圫ղז鋔挿《Ⰵ הְֲ挿דꬊ䌢ח剣⸬ז⹈䓼倯岀הְֲֿהדׅկ➙㔐ך闌䏟הꟼ侧㘗鎉铂ך濼陎ָ֮ ל뇪חꆃ啎ծ僇傈ַ0QUJPOBM㘗⢪ֲוז撕꧟זⳢ椚ח甧ぢֲַֿהחזה׃ג ֮זזׅץג荈⸂ד螟뜧ח鍑寸דֹ״ֲחזכ׆דׅկ-FUˏT0QUJPOBM-FUˏT4XJGU ׯה椚鍑׃ְ➂כ ꟼ侧㘗鎉铂㷕רֲ
את
Ұɺ0QUJPOBMܕϞφυͰ͋Δ
Ұɺ0QUJPOBMܕNBQͱqBU.BQ ͱ͍͏ϝιουΛ͍࣋ͬͯΔ
Ұɺ0QUJPOBMܕ 0QUJPOBM5ͱఆٛ͞ΕΔܕͰ͋Δ
͑"SSBZ5ה⡂״ֲז㶷㖈
אתծ*OU ה*OUכ 㸣Ⰻח麩ֲך
*OU 0QUJPOBM*OU
*OU 0QUJPOBM0QUJPOBM*OU
0QUJPOBM5כ 銲稆ָ♧⦐׃ַⰅזְ盲ד֮
0QUJPOBM㘗ך㹋鄲♧鿇 public enum Optional<Wrapped> : ExpressibleByNilLiteral { case none case
some(Wrapped) }
Ұɺ0QUJPOBMܕ FYUFOTJPOͰ֦ுͰ͖Δ
䭁䓸ך⢽ extension Optional { public func reduce<U>(_ initial: U, combine:
(U, Wrapped) -> U) -> U { switch self { case .none: return initial case .some(let value): return combine(initial, value) } } public func filter(_ includeElement: @escaping (Wrapped) -> Bool) -> Wrapped? { return flatMap { includeElement($0) ? $0 : nil } } public func forEach(_ action: (Wrapped) -> ()) { reduce(()) { action($1) } } }
Ύ㉏겗鍑ְג״ֲ
⟃♴ך״ֲז儗ծ֮זזוֲ剅ֹתַׅ ˖ B*OU ָ֮הֹծBך⦼✳⛦׃ְկ׃ծBָOJMך㜥さכOJM䖤ְկ ˖ BSSBZ<*OU> ָ֮הֹծBSSBZך剑ⴱך銲稆《䖤׃ְկ׃ծBSSBZָOJMַծ 剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך㜥さכOJM䖤ְկؼٝز<*OU>כSTU *OU הְֲفٗػذ؍䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM鵤ׅկ
˖ Y%PVCMF ָ֮הֹծYך䎂倯呎鎘皾׃ְկ׃ծYָOJMתכ頾ך侧ך㜥 さכOJM䖤ְկזֶծTRSU㸜Ⰻח׃頾ך侧床ׅהOJM鵤ׅꟼ侧 TBGF4RSU%PVCMF%PVCMF ָ֮ךה׃ג罋ִג葺ְկ ˖ B*OU הC*OU ָ֮הֹծB C鎘皾׃ְկ׃ծBַCָOJMך㜥さחכ OJM䖤ְկ
B*OU ָ֮הֹծBך⦼✳⛦׃ְկ ׃ծBָOJMך㜥さכOJM䖤ְկ
♧菙涸鍑瘶 // 1൪ var result: Int? if let a0 =
a { result = a0 * a0 } else { result = nil } // or result = a == nil ? nil : a! * a!
㸜Ⰻַא知患ז鍑瘶 // simple answer result = a.map { $0 *
$0 }
BSSBZ<*OU> ָ֮הֹծBSSBZך剑ⴱך銲稆《䖤׃ְկ ׃ծBSSBZָOJMַծ剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך 㜥さכOJM䖤ְկؼٝز<*OU>כSTU*OU הְֲفٗػ ذ؍䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM鵤ׅկ
♧菙涸鍑瘶 // 2൪ if let array0 = array { if
let first = array0.first { result = first } else { result = nil } } else { result = nil } // Int??ʹͳΔ͚Ͳ... var result2: Int?? = array.map { $0.first }
㸜Ⰻַא知患ז鍑瘶 // simple answer result = array?.first
Y%PVCMF ָ֮הֹծYך䎂倯呎鎘皾׃ְկ׃ծ YָOJMתכ頾ך侧ך㜥さכOJM䖤ְկזֶծTRSU㸜Ⰻ ח׃頾ך侧床ׅהOJM鵤ׅꟼ侧TBGF4RSU%PVCMF %PVCMF ָ֮ךה׃ג罋ִג葺ְկ
♧菙涸鍑瘶 // 3൪ if let x0 = x { resultDouble
= safeSqrt(x0) } else { resultDouble = nil } // Double??ʹͳΔ͚Ͳ... let result3: Double?? = x.map { safeSqrt($0) } // ??Λ͏ resultDouble = x.map { safeSqrt($0) } ?? nil
㸜Ⰻַא知患ז鍑瘶 // simple answer resultDouble = x.flatMap { safeSqrt($0) }
// ͬͱ͘ʂ resultDouble = x.flatMap(safeSqrt)
B*OU הC*OU ָ֮הֹծB C鎘皾 ׃ְկ׃ծBַCָOJMך㜥さחכOJM 䖤ְկ
♧菙涸鍑瘶 // 4൪ if let a0 = a { if
let b0 = b { result = a0 + b0 } else { result = nil } } else { result = nil } // Int??ʹͳΔ͚Ͳ... result2 = a.map { a0 in b.map { b0 in a0 + b0 } }
㸜Ⰻַא知患ז鍑瘶 // simple answer result = a.flatMap { a0 in
b.map { b0 in a0 + b0 } }
⟃♳ד
0QUJPOBMܕօ ˋ➬穈ה嚊䙀ד椚鍑ׅ0QUJPOBM㘗ˋ hUPVZPV
הְֲせך
2JJUB 4XJGUך0QUJPOBM㘗噰CZ!LPIFSׁ ך銲秈穄ח׃תׅկ
5IBOLTGPSMJTUFOJOH˘ ˟铡僇׃ֹזַ鿇ⴓכ⯋ך鎸✲铣דגְֻׁկ
ְעסֻּ֭