Skip to content

Commit

Permalink
Merge pull request #42 from JosephDuffy/store-dates-in-userdefaults
Browse files Browse the repository at this point in the history
Support storing `Date`s in `UserDefaults`
  • Loading branch information
JosephDuffy authored Aug 30, 2021
2 parents d4b3b6b + 0f4f3cf commit 2c7ec03
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Sources/Persist/UserDefaults/StorableInUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
7 changes: 7 additions & 0 deletions Sources/Persist/UserDefaults/UserDefaultsValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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] = []

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)]))
}
Expand Down
22 changes: 22 additions & 0 deletions Tests/PersistTests/UserDefaults/UserDefaultsStorageTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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([
Expand Down

0 comments on commit 2c7ec03

Please sign in to comment.