# UserDefaultsStore **Repository Path**: yulin97/UserDefaultsStore ## Basic Information - **Project Name**: UserDefaultsStore - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-11 - **Last Updated**: 2022-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Build Status Test Coverage Platforms Cocoapods Carthage compatible Swift Package Manager compatible Swift Xcode MIT

# tl;dr You love Swift's `Codable` protocol and use it everywhere, who doesn't! Here is an easy and very light way to store and retrieve -**reasonable amount 😅**- of `Codable` objects, in a couple lines of code! --- ## Introducing v2.0 - Removed the `Identifiable` protocol in favor of Swift's `Identifiable`. - Increased deployment targets to iOS `13.0`, `tvOS 13.0`, `macOS 10.15`, and `watchOS 6.0`. - Objects defined as non-final classes can now be used as well. - Added new `generateSnapshot()` and `restoreSnapshot(_:)` methods to generate and restore a `Snapshot` object that can be saved (e.g. to iCloud) and restored later. - Fixed a bug where `objectsCount` might run out of sync with the actual count of objects in store. --- ## Installation
Swift Package Manager (Recommended)

You can use The Swift Package Manager to install UserDefaultsStore by adding the proper description to your Package.swift file:

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    targets: [],
    dependencies: [
        .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "2.0.0")
    ]
)

Next, add UserDefaultsStore to your targets dependencies like so:

.target(
    name: "YOUR_TARGET_NAME",
    dependencies: [
        "UserDefaultsStore",
    ]
),

Then run swift package update.

CocoaPods

To integrate UserDefaultsStore into your Xcode project using CocoaPods, specify it in your Podfile:

pod 'UserDefaultsStore'
Carthage

To integrate UserDefaultsStore into your Xcode project using Carthage, specify it in your Cartfile:

github "omaralbeik/UserDefaultsStore" ~> 2.0.0
Manually

Add the Sources folder to your Xcode project.

## Usage Let's say you have 2 structs; `User` and `Laptop` defined as bellow: ```swift struct User: Codable { var id: Int var firstName: String var lastName: String var laptop: Laptop? } ``` ```swift struct Laptop: Codable { var model: String var name: String } ``` Here is how you store them in **UserDefaultsStore**: ### 1. Conform to the `Identifiable` protocol and set the `id` property The `Identifiable` protocol lets UserDefaultsStore knows what is the unique id for each object. ```swift struct User: Codable, Identifiable { ... } ``` ```swift struct Laptop: Codable, Identifiable { var id: String { model } ... } ``` ### 2. Create UserDefaults Stores ```swift let usersStore = UserDefaultsStore(uniqueIdentifier: "users") let laptopsStore = UserDefaultsStore(uniqueIdentifier: "laptops") ``` ### 3. Voilà, you're all set! ```swift let macbook = Laptop(model: "A1278", name: "MacBook Pro") let john = User(id: 1, firstName: "John", lastName: "Appleseed", laptop: macbook) // Save an object to a store try! usersStore.save(john) // Save an array of objects to a store try! usersStore.save([jane, steve, jessica]) // Get an object from store let user = store.object(withId: 1) let laptop = store.object(withId: "A1278") // Get all objects in a store let laptops = laptopsStore.allObjects() // Check if store has an object print(usersStore.hasObject(withId: 10)) // false // Iterate over all objects in a store laptopsStore.forEach { laptop in print(laptop.name) } // Delete an object from a store usersStore.delete(withId: 1) // Delete all objects in a store laptops.deleteAll() // Know how many objects are stored in a store let usersCount = usersStore.objectsCount // Create a snapshot let snapshot = usersStore.generateSnapshot() // Restore a pre-generated snapshot try? usersStore.restoreSnapshot(snapshot) ``` ## Looking to store a single item only? Use [`SingleUserDefaultsStore`](https://github.com/omaralbeik/UserDefaultsStore/blob/master/Sources/SingleUserDefaultsStore.swift), it enables storing and retrieving a single value of `Int`, `Double`, `String`, or any `Codable` type. ## Requirements - iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+ - Swift 5.0+ ## Thanks Special thanks to: - [Paul Hudson](https://twitter.com/twostraws) for his [article](https://www.hackingwithswift.com/articles/57/how-swift-keypaths-let-us-write-more-natural-code) on how to use Swift keypaths to write more natural code. - [Batuhan Saka](https://github.com/strawb3rryx7) for translating this document into [Turkish](https://github.com/omaralbeik/UserDefaultsStore/blob/master/README_TR.md). ## Credits Icon made by [freepik](https://www.flaticon.com/authors/freepik) from [flaticon.com](https://www.flaticon.com). ## License UserDefaultsStore is released under the MIT license. See [LICENSE](https://github.com/omaralbeik/UserDefaultsStore/blob/master/LICENSE) for more information.