Skip to content

Commit 3583699

Browse files
committed
DateComponents : Codable implemented
1 parent 93a2a37 commit 3583699

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

Foundation/DateComponents.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,3 +341,83 @@ extension DateComponents : _ObjectTypeBridgeable {
341341
}
342342
}
343343

344+
extension DateComponents : Codable {
345+
private enum CodingKeys : Int, CodingKey {
346+
case calendar
347+
case timeZone
348+
case era
349+
case year
350+
case month
351+
case day
352+
case hour
353+
case minute
354+
case second
355+
case nanosecond
356+
case weekday
357+
case weekdayOrdinal
358+
case quarter
359+
case weekOfMonth
360+
case weekOfYear
361+
case yearForWeekOfYear
362+
}
363+
364+
public init(from decoder: Decoder) throws {
365+
let container = try decoder.container(keyedBy: CodingKeys.self)
366+
let calendar = try container.decodeIfPresent(Calendar.self, forKey: .calendar)
367+
let timeZone = try container.decodeIfPresent(TimeZone.self, forKey: .timeZone)
368+
let era = try container.decodeIfPresent(Int.self, forKey: .era)
369+
let year = try container.decodeIfPresent(Int.self, forKey: .year)
370+
let month = try container.decodeIfPresent(Int.self, forKey: .month)
371+
let day = try container.decodeIfPresent(Int.self, forKey: .day)
372+
let hour = try container.decodeIfPresent(Int.self, forKey: .hour)
373+
let minute = try container.decodeIfPresent(Int.self, forKey: .minute)
374+
let second = try container.decodeIfPresent(Int.self, forKey: .second)
375+
let nanosecond = try container.decodeIfPresent(Int.self, forKey: .nanosecond)
376+
377+
let weekday = try container.decodeIfPresent(Int.self, forKey: .weekday)
378+
let weekdayOrdinal = try container.decodeIfPresent(Int.self, forKey: .weekdayOrdinal)
379+
let quarter = try container.decodeIfPresent(Int.self, forKey: .quarter)
380+
let weekOfMonth = try container.decodeIfPresent(Int.self, forKey: .weekOfMonth)
381+
let weekOfYear = try container.decodeIfPresent(Int.self, forKey: .weekOfYear)
382+
let yearForWeekOfYear = try container.decodeIfPresent(Int.self, forKey: .yearForWeekOfYear)
383+
384+
self.init(calendar: calendar,
385+
timeZone: timeZone,
386+
era: era,
387+
year: year,
388+
month: month,
389+
day: day,
390+
hour: hour,
391+
minute: minute,
392+
second: second,
393+
nanosecond: nanosecond,
394+
weekday: weekday,
395+
weekdayOrdinal: weekdayOrdinal,
396+
quarter: quarter,
397+
weekOfMonth: weekOfMonth,
398+
weekOfYear: weekOfYear,
399+
yearForWeekOfYear: yearForWeekOfYear)
400+
}
401+
402+
public func encode(to encoder: Encoder) throws {
403+
// TODO: Replace all with encodeIfPresent, when added.
404+
var container = encoder.container(keyedBy: CodingKeys.self)
405+
if self.calendar != nil { try container.encode(self.calendar!, forKey: .calendar) }
406+
if self.timeZone != nil { try container.encode(self.timeZone!, forKey: .timeZone) }
407+
if self.era != nil { try container.encode(self.era!, forKey: .era) }
408+
if self.year != nil { try container.encode(self.year!, forKey: .year) }
409+
if self.month != nil { try container.encode(self.month!, forKey: .month) }
410+
if self.day != nil { try container.encode(self.day!, forKey: .day) }
411+
if self.hour != nil { try container.encode(self.hour!, forKey: .hour) }
412+
if self.minute != nil { try container.encode(self.minute!, forKey: .minute) }
413+
if self.second != nil { try container.encode(self.second!, forKey: .second) }
414+
if self.nanosecond != nil { try container.encode(self.nanosecond!, forKey: .nanosecond) }
415+
416+
if self.weekday != nil { try container.encode(self.weekday!, forKey: .weekday) }
417+
if self.weekdayOrdinal != nil { try container.encode(self.weekdayOrdinal!, forKey: .weekdayOrdinal) }
418+
if self.quarter != nil { try container.encode(self.quarter!, forKey: .quarter) }
419+
if self.weekOfMonth != nil { try container.encode(self.weekOfMonth!, forKey: .weekOfMonth) }
420+
if self.weekOfYear != nil { try container.encode(self.weekOfYear!, forKey: .weekOfYear) }
421+
if self.yearForWeekOfYear != nil { try container.encode(self.yearForWeekOfYear!, forKey: .yearForWeekOfYear) }
422+
}
423+
}

TestFoundation/TestCodable.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,34 @@ class TestCodable : XCTestCase {
341341
expectRoundTripEqualityThroughJSON(for: calendar)
342342
}
343343
}
344+
345+
// MARK: - DateComponents
346+
lazy var dateComponents: Set<Calendar.Component> = [
347+
.era,
348+
.year,
349+
.month,
350+
.day,
351+
.hour,
352+
.minute,
353+
.second,
354+
.weekday,
355+
.weekdayOrdinal,
356+
.weekOfMonth,
357+
.weekOfYear,
358+
.yearForWeekOfYear,
359+
.timeZone,
360+
.calendar,
361+
// Disabled due to a bug in Calendar.dateComponents(_:from:)
362+
// crashing if components include .nanosecond or .quarter
363+
// .nanosecond,
364+
// .quarter,
365+
]
366+
367+
func test_DateComponents_JSON() {
368+
let calendar = Calendar(identifier: .gregorian)
369+
let components = calendar.dateComponents(dateComponents, from: Date(timeIntervalSince1970: 1501283776))
370+
expectRoundTripEqualityThroughJSON(for: components)
371+
}
344372
}
345373

346374
extension TestCodable {
@@ -361,6 +389,7 @@ extension TestCodable {
361389
("test_CharacterSet_JSON", test_CharacterSet_JSON),
362390
("test_TimeZone_JSON", test_TimeZone_JSON),
363391
("test_Calendar_JSON", test_Calendar_JSON),
392+
("test_DateComponents_JSON", test_DateComponents_JSON),
364393
]
365394
}
366395
}

0 commit comments

Comments
 (0)