From df194a0728ba89dfc147f6833956d8898301c2f8 Mon Sep 17 00:00:00 2001 From: Omar Elsayed <125718818+EngOmarElsayed@users.noreply.github.com> Date: Thu, 30 May 2024 01:34:12 +0300 Subject: [PATCH] Feature remove objects (#8) * RemoveObject feature * Update README.md Updated the README.md with the new feature --- README.md | 27 ++++++++++++++++++- Sources/UserDefaults/DefaultKeys.swift | 20 ++++++++++++++ .../UserDefaultsTests/UserDefaultsTests.swift | 20 ++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3185d9..04fa618 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,10 @@ 2. [How to use](#section-1) - [Custome Container](#sub-topic-1.1) - [Supported Data](#sub-topic-1.2) -4. [Storing Custome Data](#section-2) +3. [Storing Custome Data](#section-2) - [Example 1 Enums](#sub-topic-2.1) - [Example 2 Custom Array type](#sub-topic-2.2) +4. [RemovingStoredObjects](#section-3) 5. [Author](#conclusion) ## Introduction @@ -100,6 +101,30 @@ init() } @UserDefaults(\.customeData) var customeData: [CustomeData] = [CustomeData()] ``` + +## RemovingStoredObjects +You can also remove the stored value for a specific key using the `DefaultKeys.removeObject(at keyPath: KeyPath, _ container: UserDefaults = .standard)`, as demonstrated below: + +```swift +@UserDefaults(\.testKey) var test = 3 +DefaultKeys.removeObject(\.testKey) +// if you use a custome container provide it to the funcation using this syntax, +// DefaultKeys.removeObject(at keyPath: KeyPath, _ container: UserDefaults = .standard) +``` + +> [!NOTE] +> When you call `test` after removing the stored value, it will give the default value which is equal `3` in this case (which is not stored UserDefaults2 store). +> if it was an `optional` the output will be `nil` in this case. + +if you want to delete all the values in the UserDefaults, you can use `DefaultKeys.removeAllUserDefaultsObjects(for container: UserDefaults = .standard)`: + +```swift +@UserDefaults(\.testKey) var test = 3 +DefaultKeys.removeAllUserDefaultsObjects() +// if you use a custome container provide it to the funcation using this syntax, +// DefaultKeys.removeAllUserDefaultsObjects(for container: UserDefaults = .standard) +``` + And that's all there is to it! 🚀 Enjoy using this Swifty package. ## Author diff --git a/Sources/UserDefaults/DefaultKeys.swift b/Sources/UserDefaults/DefaultKeys.swift index 0cb2957..264ea82 100644 --- a/Sources/UserDefaults/DefaultKeys.swift +++ b/Sources/UserDefaults/DefaultKeys.swift @@ -30,3 +30,23 @@ public struct DefaultKeys { return current[keyPath: key] } } + +//MARK: - Removing Stored Objects +extension DefaultKeys { + /// Clears all the objects stored in the specified container. By default it uses the ``.standard`` container. + /// + /// When you call the variable after removing it, you will get the default value you provided or nil if it was optional. + public static func removeAllUserDefaultsObjects(for container: UserDefaults = .standard) { + if let domainName = Bundle.main.bundleIdentifier { + container.removePersistentDomain(forName: domainName) + container.synchronize() + } + } + + /// Removes the Value at the specified keyPath. + /// + /// When you call the variable after removing it, you will get the default value you provided or nil if it was optional. + public static func removeObject(at keyPath: KeyPath, _ container: UserDefaults = .standard) { + container.removeObject(forKey: DefaultKeys[keyPath]) + } +} diff --git a/Tests/UserDefaultsTests/UserDefaultsTests.swift b/Tests/UserDefaultsTests/UserDefaultsTests.swift index 2211fde..20ce7b0 100644 --- a/Tests/UserDefaultsTests/UserDefaultsTests.swift +++ b/Tests/UserDefaultsTests/UserDefaultsTests.swift @@ -82,6 +82,26 @@ internal final class UserDefaultsTests: XCTestCase { XCTAssertEqual(testValue, expectedResult, "Expected to have the same value got \(testValue)") } + func test_UserDefaultWrapper_removeAllUserDefaultsObjects_givesTheDefault() { + let expectedResult = "2" + @UserDefault(\.testKey) var testValue: String = "2" + + testValue = "5" + DefaultKeys.removeAllUserDefaultsObjects() + + XCTAssertEqual(testValue, expectedResult, "Expected to have the same value got \(testValue)") + } + + func test_UserDefaultWrapper_removeObjectFromUserDefaults_givesTheDefault() { + let expectedResult = "2" + @UserDefault(\.testKey) var testValue: String = "2" + + testValue = "5" + DefaultKeys.removeObject(at: \.testKey) + + XCTAssertEqual(testValue, expectedResult, "Expected to have the same value got \(testValue)") + } + private func deleteArtifactsFromUserDefaults(for key: KeyPath) { UserDefaults.standard.removeObject(forKey: DefaultKeys[key]) }