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
0
1.2k
Optional皆伝
http://qiita.com/koher/items/c6f446bad54442a28bf4
この記事を参考にSwiftのOptional型についてまとめさせていただきました。
touyou
October 29, 2016
Tweet
Share
More Decks by touyou
See All by touyou
生成AI活用プロダクトが目指してほしい未来
touyou
0
1.6k
メンター百物語 紡ぎ続けられる確かな情熱
touyou
0
250
これからの時代の『クリエイター』の生き方
touyou
0
43
しくじり先生〜とうようがLeaders7期生からL4S7期講師になるまでのプログラミング半生を振り返る
touyou
0
82
AWSサーバーレスが支える劇団ノーミーツのオンライン劇場ZA / AWS Dev Day Online 2021 C-5
touyou
0
1.4k
3年A組から学ぶ体験の作り方
touyou
0
1.9k
學問のすすめ
touyou
0
1.2k
粒子法について その1
touyou
0
140
粒子法について その2
touyou
1
74
Other Decks in Programming
See All in Programming
PRレビューのお供にDanger
stoticdev
1
230
SwiftUI Viewの責務分離
elmetal
PRO
2
260
CI改善もDatadogとともに
taumu
0
190
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
14
4.6k
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
4
760
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
160
Unity Android XR入門
sakutama_11
0
180
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
170
.NET Frameworkでも汎用ホストが使いたい!
tomokusaba
0
190
DROBEの生成AI活用事例 with AWS
ippey
0
140
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
910
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
7
4.2k
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
137
6.8k
Designing Experiences People Love
moore
140
23k
Designing on Purpose - Digital PM Summit 2013
jponch
117
7.1k
Become a Pro
speakerdeck
PRO
26
5.2k
Side Projects
sachag
452
42k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
Gamification - CAS2011
davidbonilla
80
5.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
A Tale of Four Properties
chriscoyier
158
23k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
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˘ ˟铡僇׃ֹזַ鿇ⴓכ⯋ך鎸✲铣דגְֻׁկ
ְעסֻּ֭