# 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
# 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.