diff --git a/Sources/Persist/UserDefaults/StorableInUserDefaults.swift b/Sources/Persist/UserDefaults/StorableInUserDefaults.swift index bf67d7d..ab6e19d 100644 --- a/Sources/Persist/UserDefaults/StorableInUserDefaults.swift +++ b/Sources/Persist/UserDefaults/StorableInUserDefaults.swift @@ -61,6 +61,13 @@ extension Float: InternalStorableInUserDefaults { } } +extension Date: InternalStorableInUserDefaults { + /// An `UserDefaultsValue.date` wrapping `self`. + internal var asUserDefaultsValue: UserDefaultsValue { + return .date(self) + } +} + extension Array: StorableInUserDefaults where Element: StorableInUserDefaults {} extension Array: InternalStorableInUserDefaults where Element: InternalStorableInUserDefaults { diff --git a/Sources/Persist/UserDefaults/UserDefaultsValue.swift b/Sources/Persist/UserDefaults/UserDefaultsValue.swift index 10e1437..7c1b932 100644 --- a/Sources/Persist/UserDefaults/UserDefaultsValue.swift +++ b/Sources/Persist/UserDefaults/UserDefaultsValue.swift @@ -42,6 +42,9 @@ internal enum UserDefaultsValue: Hashable { /// A `URL` value. case url(URL) + /// A `Date` value. + case date(Date) + case number(NSNumber) /// An `Array` value. @@ -86,6 +89,8 @@ internal enum UserDefaultsValue: Hashable { return url case .number(let nsNumber): return nsNumber + case .date(let date): + return date case .array(let array): return array.map(\.value) case .dictionary(let dictionary): @@ -115,6 +120,8 @@ internal enum UserDefaultsValue: Hashable { self = .float(float) } else if let double = value as? Double { self = .double(double) + } else if let date = value as? Date { + self = .date(date) } else if let anyArray = value as? [Any] { var array: [UserDefaultsValue] = [] diff --git a/Tests/PersistTests/UserDefaults/StorableInUserDefaultsTests.swift b/Tests/PersistTests/UserDefaults/StorableInUserDefaultsTests.swift index 52e17a9..b70e11b 100644 --- a/Tests/PersistTests/UserDefaults/StorableInUserDefaultsTests.swift +++ b/Tests/PersistTests/UserDefaults/StorableInUserDefaultsTests.swift @@ -29,6 +29,11 @@ final class StorableInUserDefaultsTests: XCTestCase { XCTAssertEqual(Double(123.45).asUserDefaultsValue, .double(123.45)) } + func testDate() { + let date = Date() + XCTAssertEqual(date.asUserDefaultsValue, .date(date)) + } + func testArray() { XCTAssertEqual([123].asUserDefaultsValue, .array([.int(123)])) } diff --git a/Tests/PersistTests/UserDefaults/UserDefaultsStorageTests.swift b/Tests/PersistTests/UserDefaults/UserDefaultsStorageTests.swift index eb017dd..a75fb7e 100644 --- a/Tests/PersistTests/UserDefaults/UserDefaultsStorageTests.swift +++ b/Tests/PersistTests/UserDefaults/UserDefaultsStorageTests.swift @@ -219,6 +219,28 @@ final class UserDefaultsStorageTests: XCTestCase { waitForExpectations(timeout: 0.1) } + func testStoringDate() { + let key = "key" + let date = Date() + + let callsUpdateListenerExpectation = expectation(description: "Calls update listener") + let subscription = userDefaultsStorage.addUpdateListener(forKey: key) { newValue in + defer { + callsUpdateListenerExpectation.fulfill() + } + + XCTAssertEqual(newValue, .date(date), "Value passed to update listener should be new value") + } + _ = subscription + + userDefaultsStorage.storeValue(.date(date), key: key) + + XCTAssertEqual(userDefaultsStorage.userDefaults.object(forKey: key) as? Date, date, "Date should be stored as Date") + XCTAssertEqual(userDefaultsStorage.retrieveValue(for: key), .date(date)) + + waitForExpectations(timeout: 0.1) + } + func testStoringArray() { let key = "key" let ubiquitousKeyValueStoreValue = UserDefaultsValue.array([