⚠️ Deprecated ⚠️
Please use the new Stores library instead.
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!
New in v3.0
- Both
UserDefaultsStoreandSingleUserDefaultsStoreare thread safe! - BREAKING: Use of custom encoder/decoder has been removed.
- BREAKING: Snapshots have been removed.
Installation
Swift Package Manager
- Add the following to your
Package.swiftfile:
dependencies: [ .package(url: "https://github.com/omaralbeik/UserDefaultsStore.git", from: "3.0.0") ]
- Build your project:
Manually
Add the Sources folder to your Xcode project.
Usage
Let's say you have 2 structs; User and Laptop defined as bellow:
struct User: Codable { var id: Int var firstName: String var lastName: String var laptop: Laptop? }
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.
struct User: Codable, Identifiable { ... }
struct Laptop: Codable, Identifiable { var id: String { model } ... }
2. Create UserDefaults Stores
let usersStore = UserDefaultsStore<User>(uniqueIdentifier: "users") let laptopsStore = UserDefaultsStore<Laptop>(uniqueIdentifier: "laptops")
3. Voilà, you're all set!
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
Looking to store a single item only?
Use SingleUserDefaultsStore, 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 for his article on how to use Swift keypaths to write more natural code.
- Batuhan Saka for helping with translation into Turkish
Credits
Icon made by freepik from flaticon.com.
License
UserDefaultsStore is released under the MIT license. See LICENSE for more information.