Skip to content

Commit 93a2a37

Browse files
committed
Calendar : Codable implemented
1 parent f79d510 commit 93a2a37

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

Foundation/Calendar.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,3 +1189,36 @@ extension Calendar: _ObjectTypeBridgeable {
11891189
return result!
11901190
}
11911191
}
1192+
1193+
extension Calendar : Codable {
1194+
private enum CodingKeys : Int, CodingKey {
1195+
case identifier
1196+
case locale
1197+
case timeZone
1198+
case firstWeekday
1199+
case minimumDaysInFirstWeek
1200+
}
1201+
1202+
public init(from decoder: Decoder) throws {
1203+
let container = try decoder.container(keyedBy: CodingKeys.self)
1204+
let identifierString = try container.decode(String.self, forKey: .identifier)
1205+
let identifier = Calendar._fromNSCalendarIdentifier(NSCalendar.Identifier(rawValue: identifierString))
1206+
self.init(identifier: identifier)
1207+
1208+
self.locale = try container.decodeIfPresent(Locale.self, forKey: .locale)
1209+
self.timeZone = try container.decode(TimeZone.self, forKey: .timeZone)
1210+
self.firstWeekday = try container.decode(Int.self, forKey: .firstWeekday)
1211+
self.minimumDaysInFirstWeek = try container.decode(Int.self, forKey: .minimumDaysInFirstWeek)
1212+
}
1213+
1214+
public func encode(to encoder: Encoder) throws {
1215+
var container = encoder.container(keyedBy: CodingKeys.self)
1216+
1217+
let identifier = Calendar._toNSCalendarIdentifier(self.identifier).rawValue
1218+
try container.encode(identifier, forKey: .identifier)
1219+
try container.encode(self.locale, forKey: .locale)
1220+
try container.encode(self.timeZone, forKey: .timeZone)
1221+
try container.encode(self.firstWeekday, forKey: .firstWeekday)
1222+
try container.encode(self.minimumDaysInFirstWeek, forKey: .minimumDaysInFirstWeek)
1223+
}
1224+
}

TestFoundation/TestCodable.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,30 @@ class TestCodable : XCTestCase {
317317
expectRoundTripEqualityThroughJSON(for: timeZone)
318318
}
319319
}
320+
321+
// MARK: - Calendar
322+
lazy var calendarValues: [Calendar] = [
323+
Calendar(identifier: .gregorian),
324+
Calendar(identifier: .buddhist),
325+
Calendar(identifier: .chinese),
326+
Calendar(identifier: .coptic),
327+
Calendar(identifier: .ethiopicAmeteMihret),
328+
Calendar(identifier: .ethiopicAmeteAlem),
329+
Calendar(identifier: .hebrew),
330+
Calendar(identifier: .iso8601),
331+
Calendar(identifier: .indian),
332+
Calendar(identifier: .islamic),
333+
Calendar(identifier: .islamicCivil),
334+
Calendar(identifier: .japanese),
335+
Calendar(identifier: .persian),
336+
Calendar(identifier: .republicOfChina),
337+
]
338+
339+
func test_Calendar_JSON() {
340+
for calendar in calendarValues {
341+
expectRoundTripEqualityThroughJSON(for: calendar)
342+
}
343+
}
320344
}
321345

322346
extension TestCodable {
@@ -336,6 +360,7 @@ extension TestCodable {
336360
("test_CGRect_JSON", test_CGRect_JSON),
337361
("test_CharacterSet_JSON", test_CharacterSet_JSON),
338362
("test_TimeZone_JSON", test_TimeZone_JSON),
363+
("test_Calendar_JSON", test_Calendar_JSON),
339364
]
340365
}
341366
}

0 commit comments

Comments
 (0)