Swift library for saving and retrieving data from any kind storage.
Wrapper for UserDefaults that allows you to store and retrieve Codable objects.
import FoundationKit
struct User: Codable {
let name: String
let email: String
let age: Int
}
final class UserViewModel {
@Defaults("user", defaultValue: nil)
var user: User? {
didSet {
print("new user: \(user)")
}
}
}
A storage that provides methods to save and retrieve data from UserDefaults.
let storage = UserDefaultsStorage<Int?>(key: "MyKey")
storage.value = 1
A storage that provides methods to save and retrieve data from file system. It uses FileManager
to interact with file system.
Default path mask is: ./userDomainMask/cachesDirectory/Storages/fileName.stg
let storage = FileStorage<Int>(fileName: "TestFile.txt")
storage.value = 1
A storage that provides methods to save and retrieve data in memory.
let storage = InMemoryStorage<Int>(value: 1)
storage.value = 1
A storage that provides methods to save and retrieve data from OS Keychain. Most safety storage, but with limitations by SDK.
let storage = KeychainStorage(key: "MyKey", configuration: .init(service: Bundle.main.bundleIdentifier ?? "MyService")
storage.value = auth.token
Type-erased storage that provides methods to save and retrieve data from any kind storage. Each storage has toAny()
method which is used to convert specific storage to AnyStorage
.
let storage = UserDefaultsStorage<Int?>(key: "MyKey").toAny()
storage.value = 1
AnyStorage<Value>
conforms to Storage
protocol and can be used in composition with other storages by method combine()
or global function zip(storages:)
let userDefaultsStorage = UserDefaultsStorage<Int?>(value: 1)
let inMemoryStorage = InMemoryStorage<Int>(value: 1)
let combined = inMemoryStorage.combine(userDefaultsStorage) // AnyStorage<Int>
combined.value = 1
zip<Value>(storages: [any Storage<Value>])
is only available in iOS 16 or newer
let combined = zip(storages: [
InMemoryStorage<Int?>(value: 1),
UserDefaultsStorage(key: "MyKey")
])
zip<Value>(storages: [AnyStorage<Value>])
is deprecated in iOS 16 or newer
let combined = zip(storages: [
InMemoryStorage<Int?>(value: 1).toAny(),
UserDefaultsStorage(key: "MyKey").toAny()
])
Property wrapper that allows you to set expiration time for the value.
@Expirable(lifetime: .oneHour) var token: String?