$30 off During Our Annual Pro Sale. View Details »

Peek in Calendar implementation of swift-foundation

Peek in Calendar implementation of swift-foundation

Takuma Shimizu

October 27, 2023
Tweet

More Decks by Takuma Shimizu

Other Decks in Programming

Transcript

  1. $ZCP[V.PCJMF.FFUVQ
    TXJGUGPVOEBUJPO
    $BMFOEBSͷ࣮૷Λ೷͘

    View Slide

  2. ΞδΣϯμ
    w TXJGUGPVOEBUJPOʹ͍ͭͯ
    w TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDVͷؔ܎ਤ
    w TXJGUGPVOEBUJPOΛ೷͘
    • date(bySetting:value:for:)
    • date(byAdding:value:to:wrappingComponents:)

    View Slide

  3. w IPLVSPO
    w 5XJUUFS (JU)VC ;FOO FUDʜ
    w ೖࣾ
    w αΠϘ΢ζ0
    ffi
    DFJ04
    ࣗݾ঺հ

    View Slide

  4. TXJGUGPVOEBUJPO
    ֓ཁ
    w BQQMFTXJGUGPVOEBUJPOϦϙδτϦ
    w 'PVOEBUJPOͷΦʔϓϯιʔε൛
    w طଘͷ'PVOEBUJPOΑΓ΋଎͍
    w IUUQTHJUIVCDPNBQQMFTXJGUGPVOEBUJPO
    w IUUQTXXXTXJGUPSHCMPHGPVOEBUJPOQSFWJFXOPXBWBJMBCMF

    View Slide

  5. View Slide

  6. TXJGUGPVOEBUJPO
    TXJGUGPVOEBUJPOJDVύοέʔδ
    w TXJGUGPVOEBUJPO͕ґଘ͢Δ*$6࣮૷
    w ཪํతͳଘࡏ
    w BQQMFPTTEJTUSJCVUJPOT*$6ϦϙδτϦ͔Βࣗಈநग़
    w 4XJGU1.Λαϙʔτ
    w $ϥΠϒϥϦ
    w TXJGUGPVOEBUJPO͔Βར༻Ͱ͖ΔΑ͏ʹϒϦοδ༻$࣮૷΋༻ҙ ''*

    View Slide

  7. TXJGUGPVOEBUJPO
    w *OUFSOBUJPOBM$PNQPOFOUTGPS6OJDPEF
    w 6OJDPEFͱJOΛఏڙ͢ΔϥΠϒϥϦ
    w ࣌ؒʹؔ͢Δԋࢉ ྐྵͷऔΓѻ͍΍λΠϜκʔϯԋࢉ

    w ਺஋ɺ೔࣌ɺ௨՟ͳͲͷϑΥʔϚολʔ
    w ଞɺ6OJDPEFͷαϙʔτɺςΩετڥքɺਖ਼نදݱͳͲ
    *$6

    View Slide

  8. TXJGUGPVOEBUJPO
    w *$6͕࣋ͭػೳΛ૊Έ߹Θͤͯಠࣗͷ"1*Λఏڙ
    w *$6Ͱͷԋࢉ݁ՌͷՃ޻
    w *$6Ͱ͸࣮૷͞Ε͍ͯͳ͍೔෇ԋࢉͷ࣮૷
    w Calendar → _Calendar → ICU4C
    TXJGUGPVOEBUJPOJDVͱͷؔ܎ੑ Calendarͷ৔߹

    View Slide

  9. TXJGUGPVOEBUJPO
    w NSCalendarΫϥεͷ୯ͳΔϥούʔ
    w ΄ͱΜͲͷ৔߹ɺNSCalendarͷಉ໊ͷϝιουʹॲཧΛҠৡ͍ͯ͠Δ͚ͩ
    w $PSF'PVOEBUJPO΋όϯυϧ͞Ε͓ͯΓɺCFCalendarͰ*$6Λݺͼग़͢
    w TXJGUGPVOEBUJPO JDV
    ొ৔Ҏલ͔Βৄࡉͳ࣮૷ΛݟΔ͜ͱ͸Ͱ͖͍ͯͨ
    w TXJGUGPVOEBUJPOͱൺֱͯ͠Ͳͷఔ౓ͷৄࡉ͔͞͸ະ֬ೝ
    w Calendar → NSCalendar (CFCalendar) → ICU4C
    طଘͷTXJGUDPSFMJCTGPVOEBUJPO Calendarͷ৔߹

    View Slide

  10. struct Calendar
    class _Calendar
    class Calendar
    class GregorianCalendar
    class JapaneseCalendar
    ɾ
    ɾ
    ɾ
    class EraRules
    (ucal.cpp)
    TXJGUGPVOEBUJPO
    TXJGUGPVOEBUJPOJDV

    View Slide

  11. struct Calendar
    class _Calendar
    TXJGUGPVOEBUJPO

    View Slide

  12. TXJGUGPVOEBUJPO
    w ७ਮͳ4XJGUͷߏ଄ମ 7BMVFTFNBOUJDT

    w ΫϥΠΞϯτ͕௚઀ѻ͏͜ͱʹͳΔ෦෼
    w _Calendar͔Βͷ໭ͬͯ͘Δ݁ՌͷՃ޻
    w _Calendar΍*$6Ͱ͸࣮૷͞Ε͍ͯͳ͍೔෇ԋࢉͷ࣮૷
    public struct Calendar

    View Slide

  13. TXJGUGPVOEBUJPO
    w ओʹ*$6΁ͷϒϦοδ
    w VDBMDQQʹఆٛ͞Εͨؔ਺ ''*
    ͷݺͼग़͠
    w ݺͼग़͠தͷϩοΫ
    w *$6Ͱ͸࣮૷͞Ε͍ͯͳ͍೔෇ԋࢉͷ࣮૷
    internal class _Calendar

    View Slide

  14. struct Calendar
    class _Calendar
    TXJGUGPVOEBUJPO

    View Slide

  15. struct Calendar
    class _Calendar
    class Calendar
    class GregorianCalendar
    class JapaneseCalendar
    ɾ
    ɾ
    ɾ
    class EraRules
    (ucal.cpp)
    TXJGUGPVOEBUJPO
    TXJGUGPVOEBUJPOJDV

    View Slide

  16. class Calendar
    class GregorianCalendar
    class JapaneseCalendar
    ɾ
    ɾ
    ɾ
    class EraRules
    (ucal.cpp)
    TXJGUGPVOEBUJPOJDV

    View Slide

  17. TXJGUGPVOEBUJPOJDV
    w 4XJGU͔Β*$6 $࣮૷
    Λݺͼग़ͨ͢Ίͷ''* 'PSFJHO'VODUJPO*OUFSGBDF

    w 4XJGUͰ$Λ௚઀ݺ΂ΔΑ͏ʹͳͬͨͷͰ͸ʁ
    w *$6ͷCalendarΫϥεͷϙΠϯλΛఏڙ
    w ઌͷ_CalendarΫϥε͔Βؒ઀తʹ*$6ͷCalendarΫϥεʹΞΫηεՄೳʹ
    ucal.cpp

    View Slide

  18. TXJGUGPVOEBUJPOJDV
    w *$6
    w ྐྵಠࣗͷࣄ৘Λߟྀͨ͠೿ੜΫϥε
    w GregorianCalendar ϢϦ΢εྐྵάϨΰϦΦྐྵ

    w JapaneseCalendar ࿨ྐྵ

    w ਖ਼֬ʹ͸GregorianCalendarͷαϒΫϥε
    w FSBͱZFBSͷಈ͖͕ಛघͳͨΊɺ͞ΒʹEraRulesΫϥε͕༻ҙ͞Ε͍ͯΔ
    class Calendar

    View Slide

  19. class Calendar
    class GregorianCalendar
    class JapaneseCalendar
    ɾ
    ɾ
    ɾ
    class EraRules
    (ucal.cpp)
    TXJGUGPVOEBUJPOJDV

    View Slide

  20. struct Calendar
    class _Calendar
    class Calendar
    class GregorianCalendar
    class JapaneseCalendar
    ɾ
    ɾ
    ɾ
    class EraRules
    (ucal.cpp)
    TXJGUGPVOEBUJPO
    TXJGUGPVOEBUJPOJDV

    View Slide

  21. • date(bySetting:value:for:) -> Date?
    • date(byAdding:value:to:wrappingComponents:) -> Date?
    w υΩϡϝϯςʔγϣϯ͔Β͸ɺOJM͕ฦ͞ΕΔ৚͕͍݅·͍ͪΘ͔Βͳ͍
    w NSCalendarͰ͸ॻ͔Ε͍ͯΔ಺༰͕ඍົʹҧ͏
    w ͚Ͳ΍ͬͺΓΘ͔Βͳ͍
    w ͱΓ͋͑ͣɺvalueҾ਺ʹInt.maxΛ౉͕ͪ͠
    w ༗ޮൣғΛ୳ΔͷఘΊ͕ͪ
    TXJGUGPVOEBUJPOΛ೷͘

    View Slide

  22. දʹ·ͱΊ·ͨ͠

    View Slide

  23. ஫ҙשى
    IUUQTHJUIVCDPNBQQMFTXJGUGPVOEBUJPOUSFF
    CCBGEDFCBEFDEFD
    ͜ͷ࣌఺ ˢ
    ͷιʔείʔυΛࢀর͍ͯ͠·͢ɻ
    TXJGUGPVOEBUJPOͱTXJGUGPVOEBUJPOJDVͷίʔυ΍࣮ࡍʹಈ͔ͨ݁͠Ռ͔Βಡ
    Έऔͬͨ݁ՌͰ͢ɻਖ਼֬ʹಡΈऔΕͨอূ͸Ͱ͖͔Ͷ·͢ɻ
    ֬ೝͨ͠ྐྵ͸ɺάϨΰϦΦྐྵͱ࿨ྐྵͷΈͰ͢ɻͦͷଞͷྐྵͰ͸ɺҟͳΔ݁ՌʹͳΔ
    ͔΋͠Ε·ͤΜɻ
    04ʹόϯυϧ͞Ε͍ͯΔ'PVOEBUJPO͕ɺಉ༷ͷಈ͖Λ͢Δͷ͔͸͖ͪΜͱ֬ೝ͠
    ͍ͯ·ͤΜɻ

    View Slide

  24. date(bySetting:value:for:)
    componentx value ͷ༗ޮൣғ
    component era year
    value
    (Gregorian)
    d d
    value
    (Japanese)
    d
    ্ݶ͸೥߸͕
    มΘΔ͝ͱʹ૿Ճ
    dάϨΰϦΦྐྵͷ্ݶ͔Β
    dateͷ೥߸͕։࢝ͨ͠೥Λݮࢉ

    ݱࡏ
    ྩ࿨։࢝ͷ೥

    Լݶͷิ଍
    Լݶ͸ɺdateҾ਺ͷ஋ΑΓ΋ԼճΔ஋Λࢦఆ͢Δͱnil͕ฦΔ


    ݱࡏ
    ྐྵʹ.gregorianΛɺdateʹ.nowΛࢦఆɹɹɹɹྐྵʹ.japaneseΛɺdateʹ.nowΛࢦఆ
    FSB ੢ྐྵ
    ˠ⭕ɺ لݩલ
    ˠ❌ɹɹɹɹɹɹɹɹFSB ྩ࿨
    ˠ⭕ɺ ฏ੒
    ˠ❌
    ZFBSˠ⭕ɺҎԼˠ❌ɹɹɹɹɹɹɹɹZFBSˠ⭕ɺҎԼˠ❌

    View Slide

  25. date(bySetting:value:for:)
    componentx value ͷ༗ޮൣғ
    component month day hour
    minute,
    second
    weekday quarter weekOfMonth weekOfYear nanosecond
    value
    (ڞ௨)
    d d d d d
    d
    ͸ɺdateΛ
    ͦͷ··ฦ͢
    d d
    d

    View Slide

  26. date(bySetting:value:for:)
    componentx value ͷ༗ޮൣғ
    component calendar timeZone isLeapMonth
    value ৗʹnil͕ฦ͞ΕΔ ৗʹnil͕ฦ͞ΕΔ ৗʹnil͕ฦ͞ΕΔ

    View Slide

  27. date(bySetting:value:for:)
    componentx value ͷ༗ޮൣғ
    w weekdayOrdinalͱyearForWeekOfYear͸ௐ΂͖Εͳ͔ͬͨ
    w weekdayOrdinal ͸ɺ༗ޮൣғ಺ͱࢥΘΕΔ஋Ͱ΋Ϋϥογϡͨ͠Γॲཧ͕ࢭ·ͬͨΓ͢Δ

    View Slide

  28. w ϢϦ΢ε೔͔ΒTXJGUGPVOEBUJPO͕نఆ͢Δ࣌఺·Ͱ
    w طଘ࣮૷ͱͷޓ׵ੑͷͨΊʁ
    w d
    Date(timeIntervalSinceReferenceDate: -211845067200.0)…
    Date(timeIntervalSinceReferenceDate: 15927175497600.0)
    w date͕͜ͷൣғΛ௒͑Δͱnil͕ฦ͞ΕΔ
    w date(byAdding:value:to:wrappingComponents:)ͱ͸ҟͳΔ
    date
    date(bySetting:value:for:)

    View Slide

  29. date(byAdding:value:to:wrappingComponents:)
    componentx value ͷ༗ޮൣғ
    component
    era, year,
    month, day,
    hour, minute, second,
    weekday,
    weekdayOrdinal,
    quarter,
    weekOfMonth,
    weekOfYear,
    yearForWeekOfYear,
    nanosecond
    calendar timeZone isLeapMonth
    value IntͷൣғͰ
    ੍ݶͳ͠ ৗʹnil͕ฦ͞ΕΔৗʹnil͕ฦ͞ΕΔৗʹnil͕ฦ͞ΕΔ

    View Slide

  30. date(byAdding:value:to:wrappingComponents:)
    w ϢϦ΢ε೔͔ΒTXJGUGPVOEBUJPO͕نఆ͢Δ࣌఺·Ͱ
    w d
    Date(timeIntervalSinceReferenceDate: -211845067200.0)…
    Date(timeIntervalSinceReferenceDate: 15927175497600.0)
    w date͸ɺԋࢉલʹ͜ͷൣғʹऩ·ΔΑ͏ʹmax(min())͕औΒΕΔ
    w ԋࢉͷ݁Ռɺ͜ͷൣғ֎ʹͳͬͯ΋ͦͷ··ฦ͢
    w *$6ଆͰ͸΋ͬͱେ͖ͳൣғ لݩલສ೥

    ੢ྐྵສ೥
    ͕ѻ͑Δ
    ࠷ॳͷાஔΛߦ͏ͷ͸ɺTXJGUGPVOEBUJPOͷ੍໿ʁ
    date

    View Slide

  31. date(byAdding:value:to:wrappingComponents:)
    w ݁ՌʹӨڹ͠ͳ͍
    wrappingComponents

    View Slide

  32. • date(bySetting:value:for:) -> Date?
    • date(byAdding:value:to:wrappingComponents:) -> Date?
    w υΩϡϝϯςʔγϣϯ͔Β͸ɺOJM͕ฦ͞ΕΔ৚͕͍݅·͍ͪΘ͔Βͳ͍
    w NSCalendarͰ͸ॻ͔Ε͍ͯΔ಺༰͕ඍົʹҧ͏
    w ͚Ͳ΍ͬͺΓΘ͔Βͳ͍
    wͱΓ͋͑ͣɺvalueҾ਺ʹInt.maxΛ౉͕ͪ͠
    w ༗ޮൣғΛ୳ΔͷఘΊ͕ͪ
    TXJGUGPVOEBUJPOΛ೷͘

    View Slide

  33. value ʹ .max Λ౉͢ͱɺ
    date(byAdding:…)ͷ৔߹͸ɺdate ͷ஋͕ͦͷ··ฦ͞ΕΔ
    date(bySetting:…)ͷ৔߹͸ɺnil ͕ฦ͞ΕΔ

    View Slide