Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Optional皆伝

touyou
October 29, 2016

 Optional皆伝

http://qiita.com/koher/items/c6f446bad54442a28bf4
この記事を参考にSwiftのOptional型についてまとめさせていただきました。

touyou

October 29, 2016
Tweet

More Decks by touyou

Other Decks in Programming

Transcript

  1. 0QUJPOBMܕօ఻
    ˋ➬穈׫ה嚊䙀ד椚鍑ׅ׷0QUJPOBM㘗ˋ
    hUPVZPV

    View Slide

  2. 瑱搫דָׅ㉏겗דׅկ

    View Slide

  3. ⟃♴ך״ֲז儗ծ֮ז׋ז׵וֲ剅ֹתַׅ
    ˖ B*OU ָ֮׷הֹծBך⦼׾✳⛦׃׋ְկ׋׌׃ծBָOJMך㜥さכOJM׾䖤׋ְկ
    ˖ BSSBZ ָ֮׷הֹծBSSBZך剑ⴱך銲稆׾《䖤׃׋ְկ׋׌׃ծBSSBZָOJMַծ
    剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך㜥さכOJM׾䖤׋ְկؼٝزכSTU
    *OU הְֲفٗػذ؍׾䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM׾鵤ׅկ
    ˖ Y%PVCMF ָ֮׷הֹծYך䎂倯呎׾鎘皾׃׋ְկ׋׌׃ծYָOJMת׋כ頾ך侧ך㜥
    さכOJM׾䖤׋ְկזֶծTRSU׾㸜Ⰻח׃׋頾ך侧׾床ׅהOJM׾鵤ׅꟼ侧
    TBGF4RSU%PVCMF%PVCMF ָ֮׷׮ךה׃ג罋ִג葺ְկ
    ˖ B*OU הC*OU ָ֮׷הֹծBC׾鎘皾׃׋ְկ׋׌׃ծBַCָOJMך㜥さחכ
    OJM׾䖤׋ְկ

    View Slide

  4. 걧ך晙ꥎד
    罋ִגְֶגֻ׌ְׁկ

    View Slide

  5. 0QUJPOBM㘗׏ג
    ˖ )PHFכOJMָⰅ׵זְ
    ˖ )PHFכ剑ⴱ׌ֽOJMָⰅ׷
    ˖ )PHF כOJMד׮)PHF㘗ך⦼ד׮⟣䠐ךة؎ىؚٝדⰅ׷

    View Slide

  6. ֿ׸ָ♧菙涸ז铡僇דׅկ

    View Slide

  7. דָׅծ׫זׁ׿

    View Slide

  8. ׉׸׌ֽד0QUJPOBM㘗ָ
    ⴓַ׏׋ה劤䔲ח䙼׏גתַׅ

    View Slide

  9. ׉׸׌ֽד0QUJPOBM㘗׾
    ⢪ְֿזׇגְ׷ה
    劤䔲ח䙼׏גתַׅ

    View Slide

  10. չכְպה瘶ִ׋׉ֿך֮ז׋

    View Slide

  11. 欥ְ

    View Slide

  12. 欥ֺׅ׷

    View Slide

  13. 0QUJPOBM㘗ծ噰׭ת׃׳

    View Slide

  14. 0QUJPOBM㘗׾噰׭׸לֿ׿זֿהװ
    ˟ؿ؍ؙءّٝדׅկh傈劤ذٖؽ

    View Slide

  15. ֿ׿זֿה׌׏ג
    ˟׮׍׹׿ؿ؍ؙءّٝדׅկh8BSOFS#SPT&OUFSUBJONFOU *OD

    View Slide

  16. ׮׍׹׿דֹתׇ׿ָ˘

    View Slide

  17. החְַֻ׹ְ׹דֹ׷׿דׅ

    View Slide

  18. ⵸縧ָֹꞿֻז׶ת׃׋կ
    כׄ׭תׅկ
    ΍劤颵涸ח0QUJPOBM㘗׏ג

    View Slide

  19. Ұɺ0QUJPOBMܕ͸ϞφυͰ͋Δ

    View Slide

  20. ְװְװ׉׸⟃⵸חٌشس׏גז׿װי׿
    ˖ ֮׷岀⵱ח䖞׏ג㹋鄲ׁ׸׋

    խBU.BQ׾䭯א㘗
    ˖ ⯋ղꟼ侧㘗فؚٗٓىؚٝח

    խ״ֻ⢪׻׸׷嚊䙀
    ˖ ז׿׌ַ䬄韋涸ד

    խ״ֻ׻ַ׵זְֽו⤑ⵃ

    View Slide

  21. ٌشسחאְג4XJGUד铡僇׃ג׫׋
    ˖ הְֲ鎸✲ָ2JJUBח֮׶תׅկ鑫׃ֻכ׉׍׵⿫撑
    ˖ 'PP5ָ如ך勴⟝׾弫׋ׅ儗ٌشسהㄎע
    ˖ ⴱ劍⻉ꟼ侧ָ֮׷
    ˖ BU.BQהְֲًاحس׾׮א
    ˖ ٌشس⵱׾弫׋ׅ
    ˖ ؿ؋ؙٝة٦ד֮׷

    View Slide

  22. ٌشس⵱
    ˖ 'PP Y
    BU.BQ G
    G Y

    ˖ GPPBU.BQ\'PP
    ^GPP
    ˖ GPPBU.BQ\G
    BU.BQ H
    ^GPPBU.BQ G
    BU.BQ H

    View Slide

  23. ؿ؋ؙٝة٦
    ˖ NBQהְֲًاحس׾׮א
    ˖ ؿ؋ؙٝة٦⵱׾弫׋ׅ
    ˖ 䛎瘝ꟼ侧JEחꟼ׃גGPPNBQ JE
    JE GPP

    ˖ GPPNBQ\H G

    ^GPPNBQ G
    NBQ H

    View Slide

  24. זחָ鎉ְ׋ְַה鎉ֲה)BTLFMM׾㷕ןת׃׳ֲկ暴חչׅ׀ְ)BTLFMM׋ך׃ֻ㷕רֲպ
    כ鸐獥չׅ׀ְ)劤պהㄎל׸גֶ׶ٌشسזוָ♨㻝ח鍑铡ׁ׸גְ׷הְֲֿהד剣せז
    劤דׅկ薉铂晛ד֮׸לطحزד搀俱ד铣׬ֿה׮דֹתׅկ㹋ꥷךהֿ׹⬁כת׌铣׫ⴖ׏
    גְזְךדָׅ׌ַ׵ٌشس׮׉ֿתד椚鍑׃גְ׷׻ֽדכזְךדָׅꟼ侧㘗鎉铂
    ׾㷕עהְֲֿהכ4XJGUדꟼ侧㘗鎉铂׏שְ㹋鄲׮⢪ִ׷״ֲחז׷הְֲֿהד֮׏גծ׉
    ׸ח״׏ג➙תד撕꧟׌׏׋Ⳣ椚ָ知患ח剅ֽ׋׶׃תׅկזח״׶3Y4XJGUזוד䪔׻׸גְ
    ׷׮ךכ'VODUJPOBM3FBDUJWF1SPHSBNNJOH鸐獥'31הㄎל׸גֶ׶ꟼ侧㘗鎉铂ך暴
    䗙׾㢳ֻ《׶Ⰵ׸גְתׅկת׋4XJGUחכ0QUJPOBM㘗⟃㢩ח׮׍׳ֻ׍׳ֻٌشسחז׏ג
    ְ׷㘗ָ㶷㖈ׅ׷׋׭ֿ׸׵׾⹈䓼ׅ׷ֿהכ4XJGUד״׶ٖكٕך넝ְ㹋鄲ָדֹ׷הְֲ
    挿דהג׮䕵ח׋אךדכזְד׃׳ֲַկꞿղה铂׶ת׃׋ָאת׶זחָ鎉ְ׋ְַהְ
    ֲה4XJGU⟃㢩ך暴חַֽꨄ׸׋فؚٗٓىؚٝ鎉铂׾㷕עהְֲֿהכ圫ղז鋔挿׾《׶Ⰵ
    ׸׷הְֲ挿דꬊ䌢ח剣⸬ז⹈䓼倯岀׌הְֲֿהדׅկ➙㔐ך闌䏟הꟼ侧㘗鎉铂ך濼陎ָ֮
    ׸ל뇪חꆃ啎ծ僇傈ַ׵0QUJPOBM㘗׾⢪ֲו׿ז撕꧟זⳢ椚ח甧׍ぢֲַֿהחז׏׋ה׃ג
    ׮֮ז׋ז׵ׅץג荈⸂ד螟뜧ח鍑寸דֹ׷״ֲחז׷כ׆דׅկ-FUˏT0QUJPOBM-FUˏT4XJGU
    ׍ׯ׿ה椚鍑׃׋ְ➂כ

    ꟼ侧㘗鎉铂׾㷕רֲ

    View Slide

  25. את׶

    View Slide

  26. Ұɺ0QUJPOBMܕ͸ϞφυͰ͋Δ

    View Slide

  27. Ұɺ0QUJPOBMܕ͸NBQͱqBU.BQ
    ͱ͍͏ϝιουΛ͍࣋ͬͯΔ

    View Slide

  28. Ұɺ0QUJPOBMܕ͸
    0QUJPOBM5ͱఆٛ͞ΕΔܕͰ͋Δ

    View Slide

  29. ͑"SSBZ5ה⡂׋״ֲז㶷㖈

    View Slide

  30. את׶ծ*OU ה*OUכ
    㸣Ⰻח麩ֲ׮ך

    View Slide

  31. *OU 0QUJPOBM*OU

    View Slide

  32. *OU
    0QUJPOBM0QUJPOBM*OU

    View Slide

  33. 0QUJPOBM5כ
    銲稆ָ♧⦐׃ַⰅ׵זְ盲ד֮׷

    View Slide

  34. 0QUJPOBM㘗ך㹋鄲♧鿇
    public enum Optional : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
    }

    View Slide

  35. Ұɺ0QUJPOBMܕ͸
    FYUFOTJPOͰ֦ுͰ͖Δ

    View Slide

  36. 䭁䓸ך⢽
    extension Optional {
    public func reduce(_ 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) }
    }
    }

    View Slide

  37. Ύ㉏겗׾鍑ְג׫״ֲ

    View Slide

  38. ⟃♴ך״ֲז儗ծ֮ז׋ז׵וֲ剅ֹתַׅ
    ˖ B*OU ָ֮׷הֹծBך⦼׾✳⛦׃׋ְկ׋׌׃ծBָOJMך㜥さכOJM׾䖤׋ְկ
    ˖ BSSBZ ָ֮׷הֹծBSSBZך剑ⴱך銲稆׾《䖤׃׋ְկ׋׌׃ծBSSBZָOJMַծ
    剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך㜥さכOJM׾䖤׋ְկؼٝزכSTU
    *OU הְֲفٗػذ؍׾䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM׾鵤ׅկ
    ˖ Y%PVCMF ָ֮׷הֹծYך䎂倯呎׾鎘皾׃׋ְկ׋׌׃ծYָOJMת׋כ頾ך侧ך㜥
    さכOJM׾䖤׋ְկזֶծTRSU׾㸜Ⰻח׃׋頾ך侧׾床ׅהOJM׾鵤ׅꟼ侧
    TBGF4RSU%PVCMF%PVCMF ָ֮׷׮ךה׃ג罋ִג葺ְկ
    ˖ B*OU הC*OU ָ֮׷הֹծBC׾鎘皾׃׋ְկ׋׌׃ծBַCָOJMך㜥さחכ
    OJM׾䖤׋ְկ

    View Slide

  39. B*OU ָ֮׷הֹծBך⦼׾✳⛦׃׋ְկ
    ׋׌׃ծBָOJMך㜥さכOJM׾䖤׋ְկ

    View Slide

  40. ♧菙涸鍑瘶
    // 1൪
    var result: Int?
    if let a0 = a {
    result = a0 * a0
    } else {
    result = nil
    }
    // or
    result = a == nil ? nil : a! * a!

    View Slide

  41. 㸜Ⰻַא知患ז鍑瘶
    // simple answer
    result = a.map { $0 * $0 }

    View Slide

  42. BSSBZ ָ֮׷הֹծBSSBZך剑ⴱך銲稆׾《䖤׃׋ְկ׋
    ׌׃ծBSSBZָOJMַծ剑ⴱך銲稆ָ㶷㖈׃זְ"SSBZָ瑞ך
    㜥さכOJM׾䖤׋ְկؼٝزכSTU*OU הְֲفٗػ
    ذ؍׾䭯אկSTUכ剑ⴱך銲稆ָ㶷㖈׃זְ㜥さכOJM׾鵤ׅկ

    View Slide

  43. ♧菙涸鍑瘶
    // 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 }

    View Slide

  44. 㸜Ⰻַא知患ז鍑瘶
    // simple answer
    result = array?.first

    View Slide

  45. Y%PVCMF ָ֮׷הֹծYך䎂倯呎׾鎘皾׃׋ְկ׋׌׃ծ
    YָOJMת׋כ頾ך侧ך㜥さכOJM׾䖤׋ְկזֶծTRSU׾㸜Ⰻ
    ח׃׋頾ך侧׾床ׅהOJM׾鵤ׅꟼ侧TBGF4RSU%PVCMF
    %PVCMF ָ֮׷׮ךה׃ג罋ִג葺ְկ

    View Slide

  46. ♧菙涸鍑瘶
    // 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

    View Slide

  47. 㸜Ⰻַא知患ז鍑瘶
    // simple answer
    resultDouble = x.flatMap { safeSqrt($0) }
    // ΋ͬͱ୹͘ʂ
    resultDouble = x.flatMap(safeSqrt)

    View Slide

  48. B*OU הC*OU ָ֮׷הֹծBC׾鎘皾
    ׃׋ְկ׋׌׃ծBַCָOJMך㜥さחכOJM
    ׾䖤׋ְկ

    View Slide

  49. ♧菙涸鍑瘶
    // 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 } }

    View Slide

  50. 㸜Ⰻַא知患ז鍑瘶
    // simple answer
    result = a.flatMap { a0 in b.map { b0 in a0 + b0 } }

    View Slide

  51. ⟃♳ד

    View Slide

  52. 0QUJPOBMܕօ఻
    ˋ➬穈׫ה嚊䙀ד椚鍑ׅ׷0QUJPOBM㘗ˋ
    hUPVZPV

    View Slide

  53. הְֲせך

    View Slide

  54. 2JJUB
    4XJGUך0QUJPOBM㘗׾噰׭׷CZ!LPIFSׁ׿
    ך銲秈׾穄׻׶ח׃תׅկ

    View Slide

  55. 5IBOLTGPSMJTUFOJOH˘
    ˟铡僇׃ֹ׸זַ׏׋鿇ⴓכ⯋ך鎸✲׾铣׿ד׫גֻ׌ְׁկ

    View Slide

  56. ׵ְע׶סֻ֭׋׶׿ּ

    View Slide