Getting started
Put a value in the cache. Read it back with await.
Start with memory storage. Move to disk when an entry needs to survive beyond the cache actor.
Requirements
-
Swift 6.0 or later
-
macOS 15, iOS 17, tvOS 17, watchOS 10, or visionOS 1 or later
Install 1.1.1
Add SwiftStash to the package dependencies in Package.swift. Then add "SwiftStash" to the dependencies of your target.
Package.swift
.package(
url: "https://github.com/modern-swift-dev/swift-stash.git",
from: "1.1.1"
)
First cache entry
Cache is an actor. The cache accepts values that conform to Sendable. A string-backed enum gets the required CacheKey behavior automatically.
Swift
import SwiftStash
enum ProfileKey: String, CacheKey {
case current
}
let storage = MemoryStorageEngine<ProfileKey, String>()
let cache = await Cache(storagePolicy: storage)
await cache.add("Ada", for: .current)
let currentProfile = await cache[.current]
Persist entries to disk
Create the named directory before persistence begins. DiskStorageEngine writes each entry below the app cache directory and does not create the named subdirectory for you.
Swift
let storage = DiskStorageEngine(
directory: "profiles",
keyType: ProfileKey.self,
serializer: JsonDiskStorageSerializer<Profile>()
)
let cache = await Cache(storagePolicy: storage)
Compare cache state after eviction
Choose .fifo, .lifo, or .lru when creating the cache. Call evictExpired() to remove old entries, or call evictUntil(maxNbItems:) to first remove expired entries and then enforce a maximum count.
SwiftStash does not run a background timer. Place the eviction call in the workflow that knows when reducing the cache makes sense.
Compare cache records before and after a count limit
Before
concurrency A tour of Swift concurrency
actors Protecting state with actors
2 entries
After evictUntil(maxNbItems: 1)
concurrency A tour of Swift concurrency
1 entry