Share
Embed
Peek in Calendar implementation of swift-foundation
Takuma Shimizu
October 27, 2023
Transcript
33 slides
-
ΞδΣϯμ w TXJGUGPVOEBUJPOʹ͍ͭͯ w TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDVͷؔਤ w TXJGUGPVOEBUJPOΛ͘ • date(bySetting:value:for:)
• date(byAdding:value:to:wrappingComponents:) -
w IPLVSPO w 5XJUUFS (JU)VC ;FOO FUDʜ w ೖࣾ w
αΠϘζ0 ffi DFJ04 ࣗݾհ -
TXJGUGPVOEBUJPO ֓ཁ w BQQMFTXJGUGPVOEBUJPOϦϙδτϦ w 'PVOEBUJPOͷΦʔϓϯιʔε൛ w طଘͷ'PVOEBUJPOΑΓ͍ w IUUQTHJUIVCDPNBQQMFTXJGUGPVOEBUJPO
w IUUQTXXXTXJGUPSHCMPHGPVOEBUJPOQSFWJFXOPXBWBJMBCMF -
TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDVύοέʔδ w TXJGUGPVOEBUJPO͕ґଘ͢Δ*$6࣮ w ཪํతͳଘࡏ w BQQMFPTTEJTUSJCVUJPOT*$6ϦϙδτϦ͔Βࣗಈநग़ w 4XJGU1.Λαϙʔτ
w $ ϥΠϒϥϦ w TXJGUGPVOEBUJPO͔Βར༻Ͱ͖ΔΑ͏ʹϒϦοδ༻$࣮༻ҙ ''* -
TXJGUGPVOEBUJPO w *OUFSOBUJPOBM$PNQPOFOUTGPS6OJDPEF w 6OJDPEFͱJOΛఏڙ͢ΔϥΠϒϥϦ w ࣌ؒʹؔ͢Δԋࢉ ྐྵͷऔΓѻ͍λΠϜκʔϯԋࢉ w
ɺ࣌ɺ௨՟ͳͲͷϑΥʔϚολʔ w ଞɺ6OJDPEFͷαϙʔτɺςΩετڥքɺਖ਼نදݱͳͲ *$6 -
TXJGUGPVOEBUJPO w *$6͕࣋ͭػೳΛΈ߹Θͤͯಠࣗͷ"1*Λఏڙ w *$6Ͱͷԋࢉ݁ՌͷՃ w *$6Ͱ࣮͞Ε͍ͯͳ͍ԋࢉͷ࣮ w Calendar →
_Calendar → ICU4C TXJGUGPVOEBUJPOJDVͱͷؔੑ Calendarͷ߹ -
TXJGUGPVOEBUJPO w NSCalendarΫϥεͷ୯ͳΔϥούʔ w ΄ͱΜͲͷ߹ɺNSCalendarͷಉ໊ͷϝιουʹॲཧΛҠৡ͍ͯ͠Δ͚ͩ w $PSF'PVOEBUJPOόϯυϧ͞Ε͓ͯΓɺCFCalendarͰ*$6Λݺͼग़͢ w TXJGUGPVOEBUJPO JDV
ొҎલ͔Βৄࡉͳ࣮ΛݟΔ͜ͱͰ͖͍ͯͨ w TXJGUGPVOEBUJPOͱൺֱͯ͠Ͳͷఔͷৄࡉ͔͞ະ֬ೝ w Calendar → NSCalendar (CFCalendar) → ICU4C طଘͷTXJGUDPSFMJCTGPVOEBUJPO Calendarͷ߹ -
struct Calendar class _Calendar class Calendar class GregorianCalendar class JapaneseCalendar
ɾ ɾ ɾ class EraRules (ucal.cpp) TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDV -
TXJGUGPVOEBUJPO w ७ਮͳ4XJGUͷߏମ 7BMVFTFNBOUJDT w ΫϥΠΞϯτ͕ѻ͏͜ͱʹͳΔ෦ w _Calendar͔Βͷͬͯ͘Δ݁ՌͷՃ w
_Calendar*$6Ͱ࣮͞Ε͍ͯͳ͍ԋࢉͷ࣮ public struct Calendar -
TXJGUGPVOEBUJPO w ओʹ*$6ͷϒϦοδ w VDBMDQQʹఆٛ͞Εͨؔ ''* ͷݺͼग़͠ w ݺͼग़͠தͷϩοΫ w
*$6Ͱ࣮͞Ε͍ͯͳ͍ԋࢉͷ࣮ internal class _Calendar -
struct Calendar class _Calendar class Calendar class GregorianCalendar class JapaneseCalendar
ɾ ɾ ɾ class EraRules (ucal.cpp) TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDV -
class Calendar class GregorianCalendar class JapaneseCalendar ɾ ɾ ɾ class
EraRules (ucal.cpp) TXJGUGPVOEBUJPOJDV -
TXJGUGPVOEBUJPOJDV w 4XJGU͔Β*$6 $ ࣮ Λݺͼग़ͨ͢Ίͷ''* 'PSFJHO'VODUJPO*OUFSGBDF w 4XJGUͰ$
ΛݺΔΑ͏ʹͳͬͨͷͰʁ w *$6ͷCalendarΫϥεͷϙΠϯλΛఏڙ w ઌͷ_CalendarΫϥε͔Βؒతʹ*$6ͷCalendarΫϥεʹΞΫηεՄೳʹ ucal.cpp -
TXJGUGPVOEBUJPOJDV w *$6 w ྐྵಠࣗͷࣄΛߟྀͨ͠ੜΫϥε w GregorianCalendar ϢϦεྐྵ άϨΰϦΦྐྵ
w JapaneseCalendar ྐྵ w ਖ਼֬ʹGregorianCalendarͷαϒΫϥε w FSBͱZFBSͷಈ͖͕ಛघͳͨΊɺ͞ΒʹEraRulesΫϥε͕༻ҙ͞Ε͍ͯΔ class Calendar -
class Calendar class GregorianCalendar class JapaneseCalendar ɾ ɾ ɾ class
EraRules (ucal.cpp) TXJGUGPVOEBUJPOJDV -
struct Calendar class _Calendar class Calendar class GregorianCalendar class JapaneseCalendar
ɾ ɾ ɾ class EraRules (ucal.cpp) TXJGUGPVOEBUJPO TXJGUGPVOEBUJPOJDV -
• date(bySetting:value:for:) -> Date? • date(byAdding:value:to:wrappingComponents:) -> Date? w υΩϡϝϯςʔγϣϯ͔ΒɺOJM͕ฦ͞ΕΔ͕͍݅·͍ͪΘ͔Βͳ͍
w NSCalendarͰॻ͔Ε͍ͯΔ༰͕ඍົʹҧ͏ w ͚ͲͬͺΓΘ͔Βͳ͍ w ͱΓ͋͑ͣɺvalueҾʹInt.maxΛ͕ͪ͠ w ༗ޮൣғΛ୳ΔͷఘΊ͕ͪ TXJGUGPVOEBUJPOΛ͘ -
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ˠ⭕ɺҎԼˠ❌ -
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 -
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:) -
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͕ฦ͞ΕΔ -
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 -
• date(bySetting:value:for:) -> Date? • date(byAdding:value:to:wrappingComponents:) -> Date? w υΩϡϝϯςʔγϣϯ͔ΒɺOJM͕ฦ͞ΕΔ͕͍݅·͍ͪΘ͔Βͳ͍
w NSCalendarͰॻ͔Ε͍ͯΔ༰͕ඍົʹҧ͏ w ͚ͲͬͺΓΘ͔Βͳ͍ wͱΓ͋͑ͣɺvalueҾʹInt.maxΛ͕ͪ͠ w ༗ޮൣғΛ୳ΔͷఘΊ͕ͪ TXJGUGPVOEBUJPOΛ͘