Classes
The following classes are available globally.
@@ -107,10 +107,6 @@Declaration
-
@@ -147,8 +143,8 @@
Declaration
From 89737853ea6055b37353c3cce06cb3992dd731ca Mon Sep 17 00:00:00 2001
From: Omar Albeik
To integrate UserDefaultsStore into your Xcode project using Carthage, specify it in your
-
@@ -33,7 +32,7 @@ You love Swift's `Codable` protocol and use it everywhere, who doesn't! Here is
Cartfile
:
diff --git a/README_TR.md b/README_TR.md
index cc2a2c8..9eb3ff4 100644
--- a/README_TR.md
+++ b/README_TR.md
@@ -3,9 +3,8 @@
github "omaralbeik/UserDefaultsStore" ~> 1.4.3
+
@@ -48,7 +47,7 @@ let package = Package(
name: "YOUR_PROJECT_NAME",
targets: [],
dependencies: [
- .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "1.4.3")
+ .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "1.5.0")
]
)
github "omaralbeik/UserDefaultsStore" ~> 1.5.0
-
+
-
@@ -38,7 +37,7 @@ Swift'in `Codable` protokolüne bayılıyorsun ve her yerde kullanıyorsun, kim
UserDefaultsStore'u Carthage'u kullanarak Xcode projenize entegre etmek için, bunu Cartfile
'da belirtin:
-
github "omaralbeik/UserDefaultsStore" ~> 1.4.3
+github "omaralbeik/UserDefaultsStore" ~> 1.5.0
@@ -52,7 +51,7 @@ Swift'in `Codable` protokolüne bayılıyorsun ve her yerde kullanıyorsun, kim
import PackageDescription
dependencies: [
- .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "1.4.3")
+ .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "1.5.0")
]
diff --git a/Sources/SingleUserDefaultsStore.swift b/Sources/SingleUserDefaultsStore.swift
index a98e693..01d58d1 100644
--- a/Sources/SingleUserDefaultsStore.swift
+++ b/Sources/SingleUserDefaultsStore.swift
@@ -31,11 +31,11 @@ open class SingleUserDefaultsStore {
/// **Warning**: Never use the same identifier for two -or more- different stores.
public let uniqueIdentifier: String
- /// JSON encoder. _default is `JSONEncoder()`_
- open var encoder = JSONEncoder()
+ /// JSON encoder to be used for encoding object to be stored.
+ open var encoder: JSONEncoder
- /// JSON decoder. _default is `JSONDecoder()`_
- open var decoder = JSONDecoder()
+ /// JSON decoder to be used to decode the stored object.
+ open var decoder: JSONDecoder
/// UserDefaults store.
private var store: UserDefaults
@@ -45,9 +45,17 @@ open class SingleUserDefaultsStore {
/// **Warning**: Never use the same identifier for two -or more- different stores.
///
/// - Parameter uniqueIdentifier: store's unique identifier.
- required public init?(uniqueIdentifier: String) {
+ /// - Parameter encoder: JSON encoder to be used for encoding object to be stored. _default is `JSONEncoder()`_
+ /// - Parameter decoder: JSON decoder to be used to decode the stored object. _default is `JSONDecoder()`_
+ required public init?(
+ uniqueIdentifier: String,
+ encoder: JSONEncoder = .init(),
+ decoder: JSONDecoder = .init()
+ ) {
guard let store = UserDefaults(suiteName: uniqueIdentifier) else { return nil }
self.uniqueIdentifier = uniqueIdentifier
+ self.encoder = encoder
+ self.decoder = decoder
self.store = store
}
diff --git a/Sources/UserDefaultsStore.swift b/Sources/UserDefaultsStore.swift
index e3eb20d..dac0aff 100644
--- a/Sources/UserDefaultsStore.swift
+++ b/Sources/UserDefaultsStore.swift
@@ -31,11 +31,11 @@ open class UserDefaultsStore {
/// **Warning**: Never use the same identifier for two -or more- different stores.
public let uniqueIdentifier: String
- /// JSON encoder. _default is `JSONEncoder()`_
- open var encoder = JSONEncoder()
+ /// JSON encoder to be used for encoding objects to be stored.
+ open var encoder: JSONEncoder
- /// JSON decoder. _default is `JSONDecoder()`_
- open var decoder = JSONDecoder()
+ /// JSON decoder to be used to decode stored objects.
+ open var decoder: JSONDecoder
/// UserDefaults store.
private var store: UserDefaults
@@ -45,9 +45,17 @@ open class UserDefaultsStore {
/// **Warning**: Never use the same identifier for two -or more- different stores.
///
/// - Parameter uniqueIdentifier: store's unique identifier.
- required public init?(uniqueIdentifier: String) {
+ /// - Parameter encoder: JSON encoder to be used for encoding objects to be stored. _default is `JSONEncoder()`_
+ /// - Parameter decoder: JSON decoder to be used to decode stored objects. _default is `JSONDecoder()`_
+ required public init?(
+ uniqueIdentifier: String,
+ encoder: JSONEncoder = .init(),
+ decoder: JSONDecoder = .init()
+ ) {
guard let store = UserDefaults(suiteName: uniqueIdentifier) else { return nil }
self.uniqueIdentifier = uniqueIdentifier
+ self.encoder = encoder
+ self.decoder = decoder
self.store = store
}
diff --git a/Tests/SingleStoreTests.swift b/Tests/SingleStoreTests.swift
index cfe6ae4..9782129 100644
--- a/Tests/SingleStoreTests.swift
+++ b/Tests/SingleStoreTests.swift
@@ -31,6 +31,16 @@ final class SingleStoreTests: XCTestCase {
XCTAssertNotNil(store)
}
+ func testCreateStoreWithCustomEncoderAndDecoder() {
+ let encoder = JSONEncoder()
+ let decoder = JSONDecoder()
+
+ let store = createFreshUsersStore(encoder: encoder, decoder: decoder)
+ XCTAssertNotNil(store)
+ XCTAssert(store?.encoder === encoder)
+ XCTAssert(store?.decoder === decoder)
+ }
+
func testCreateInvalidStore() {
let invalidStore = SingleUserDefaultsStore(uniqueIdentifier: UserDefaults.globalDomain)
XCTAssertNil(invalidStore)
@@ -61,8 +71,15 @@ final class SingleStoreTests: XCTestCase {
// MARK: - Helpers
private extension SingleStoreTests {
- func createFreshUsersStore() -> SingleUserDefaultsStore? {
- let store = SingleUserDefaultsStore(uniqueIdentifier: "single-user")
+ func createFreshUsersStore(
+ encoder: JSONEncoder = .init(),
+ decoder: JSONDecoder = .init()
+ ) -> SingleUserDefaultsStore? {
+ let store = SingleUserDefaultsStore(
+ uniqueIdentifier: "single-user",
+ encoder: encoder,
+ decoder: decoder
+ )
store?.delete()
return store
}
diff --git a/Tests/StoreTests.swift b/Tests/StoreTests.swift
index c4b72ff..162c63a 100644
--- a/Tests/StoreTests.swift
+++ b/Tests/StoreTests.swift
@@ -31,6 +31,30 @@ final class StoreTests: XCTestCase {
XCTAssertNotNil(store)
}
+ func testCreateStoreWithCustomEncoderAndDecoder() {
+ let encoder = JSONEncoder()
+ let decoder = JSONDecoder()
+
+ let store = createFreshUsersStore(encoder: encoder, decoder: decoder)
+ XCTAssertNotNil(store)
+ XCTAssert(store?.encoder === encoder)
+ XCTAssert(store?.decoder === decoder)
+ }
+
+ func testCreateStoreWithCustomDecoder() {
+ let encoder = JSONEncoder()
+ encoder.keyEncodingStrategy = .useDefaultKeys
+
+ let decoder = JSONDecoder()
+ decoder.keyDecodingStrategy = .convertFromSnakeCase
+
+ let store = createFreshUsersStore(encoder: encoder, decoder: decoder)
+ XCTAssertNotNil(store)
+
+ XCTAssertNoThrow(try store?.save(TestUser.john))
+ XCTAssertEqual(store?.object(withId: TestUser.john.userId), TestUser.john)
+ }
+
func testCreateInvalidStore() {
let invalidStore = UserDefaultsStore(uniqueIdentifier: UserDefaults.globalDomain)
XCTAssertNil(invalidStore)
@@ -181,8 +205,15 @@ final class StoreTests: XCTestCase {
// MARK: - Helpers
private extension StoreTests {
- func createFreshUsersStore() -> UserDefaultsStore? {
- let store = UserDefaultsStore(uniqueIdentifier: "users")
+ func createFreshUsersStore(
+ encoder: JSONEncoder = .init(),
+ decoder: JSONDecoder = .init()
+ ) -> UserDefaultsStore? {
+ let store = UserDefaultsStore(
+ uniqueIdentifier: "users",
+ encoder: encoder,
+ decoder: decoder
+ )
store?.deleteAll()
return store
}
diff --git a/UserDefaultsStore.podspec b/UserDefaultsStore.podspec
index 41a2e15..d81959a 100644
--- a/UserDefaultsStore.podspec
+++ b/UserDefaultsStore.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "UserDefaultsStore"
- s.version = "1.4.3"
+ s.version = "1.5.0"
s.summary = "Why not use UserDefaults to store Codable objects 😉"
s.description = <<-DESC
You love Swift"s Codable protocol and use it everywhere, here is an easy and very light way to store - reasonable amount 😅 - of Codable objects, in a couple lines of code.
diff --git a/UserDefaultsStore.xcodeproj/project.pbxproj b/UserDefaultsStore.xcodeproj/project.pbxproj
index 250ceb4..e3583c7 100644
--- a/UserDefaultsStore.xcodeproj/project.pbxproj
+++ b/UserDefaultsStore.xcodeproj/project.pbxproj
@@ -399,7 +399,7 @@
INFOPLIST_FILE = Sources/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- MARKETING_VERSION = 1.4.3;
+ MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.omaralbeik.UserDefaultsStore;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -423,7 +423,7 @@
INFOPLIST_FILE = Sources/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- MARKETING_VERSION = 1.4.3;
+ MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = com.omaralbeik.UserDefaultsStore;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/docs/Classes.html b/docs/Classes.html
index ae3a396..9ecf327 100644
--- a/docs/Classes.html
+++ b/docs/Classes.html
@@ -68,7 +68,7 @@
-
+
Classes
The following classes are available globally.
@@ -107,10 +107,6 @@ Declaration
-
-
-
-
-
@@ -147,8 +143,8 @@ Declaration