Store and retrieve Codable objects to various persistence layers, in a couple lines of code!
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 Codable
objects to various persistence layers, in a few lines of code!
PersistenceKit offers 3 layers of persistence suitable for most use cases:
UserDefaults
.FileManager
.Security Framework
.v1.3 brings Swift 5.0 support
To integrate PersistenceKit into your Xcode project using CocoaPods, specify it in your Podfile
:
pod 'PersistenceKit'
To integrate PersistenceKit into your Xcode project using Carthage, specify it in your Cartfile
:
github "Teknasyon-Teknoloji/PersistenceKit"
You can use The Swift Package Manager to install PersistenceKit
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/Teknasyon-Teknoloji/PersistenceKit.git", from: "0.1")
]
)
Note that the Swift Package Manager is still in early design and development, for more information checkout its GitHub Page
Add the Sources folder to your Xcode project.
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
}
Identifiable
protocol and set the idKey
propertyThe Identifiable
protocol lets PersistenceKit knows what is the unique id for each object.
struct User: Codable, Identifiable {
static let idKey = \User.id
...
}
struct Laptop: Codable, Identifiable {
static let idKey = \Laptop.model
...
}
Notice how
User
usesInt
for its id, whileLaptop
usesString
, in fact the id can be any type. PersistenceKit uses Swift keypaths to refer to properties without actually invoking them. Swift rocks 🤘
// To save objects to UserDefaults, create UserDefaultsStore:
let usersStore = UserDefaultsStore<User>(uniqueIdentifier: "users")!
let laptopsStore = UserDefaultsStore<Laptop>(uniqueIdentifier: "laptops")!
// To save a single object to UserDefaults, create UserDefaultsStore:
let userStore = SingleUserDefaultsStore<User>(uniqueIdentifier: "user")!
// If you want to share data between app and extentions:
let sharedUsersStore = UserDefaultsStore<User>(uniqueIdentifier: "users", groupIdentifier: "com.yourCompany.app")!
let sharedUserStore = SingleUserDefaultsStore<User>(uniqueIdentifier: "user", groupIdentifier: "com.yourCompany.app")!
// To save objects to the file system, create FilesStore:
let usersStore = FilesStore<User>(uniqueIdentifier: "users")
let laptopsStore = FilesStore<Laptop>(uniqueIdentifier: "laptops")
// To save objects to the app group shared file system, create FilesStore:
let appGroup = Bundle.main.infoDictionary?["appGroup"] as? String ?? "group.company.app"
let usersStore = FilesStore<User>(uniqueIdentifier: "users", groupIdentifier: appGroup)
let laptopsStore = FilesStore<Laptop>(uniqueIdentifier: "laptops", groupIdentifier: appGroup)
// To save a single object to the file system, create SingleFilesStore:
let userStore = SingleFilesStore<User>(uniqueIdentifier: "user")
// To save a single object to the app group shared file system, create SingleFilesStore:
let appGroup = Bundle.main.infoDictionary?["appGroup"] as? String ?? "group.company.app"
let userStore = SingleFilesStore<User>(uniqueIdentifier: "user", groupIdentifier: appGroup)
// To save a single object to the system's keychain, create SingleKeychainStore:
let userStore = SingleKeychainStore<User>(uniqueIdentifier: "user")
let macbook = Laptop(model: "A1278", name: "MacBook Pro")
let john = User(userId: 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
Special thanks to:
PersistenceKit is released under the MIT license. See LICENSE for more information.