Skip to content

codingiran/SwiftyCache

Repository files navigation

💾 SwiftyCache

Swift Package Manager License: MIT Platform Contact

SwiftyCache is a lightweight, elegant, and performant in-memory cache written purely in Swift.
It supports Least-Recently-Used (LRU) eviction logic using Swift Collections’ OrderedDictionary, with optional cost-based cleanup and memory warning handling for Apple platforms.

Simple. Fast. Swifty.


🚀 Features

  • ✅ LRU (Least-Recently-Used) eviction strategy
  • ✅ Cost-based cleanup (totalCostLimit)
  • ✅ Count-based cleanup (countLimit)
  • ✅ Memory-pressure cleanup via DispatchSourceMemoryPressure
  • ✅ Actor-isolated thread-safe design
  • ✅ No Objective-C / Foundation subclassing
  • ✅ 100% Swift + SPM support
  • ✅ Clean and minimal API

📦 Installation

Swift Package Manager

dependencies: [
    .package(url: "https://github.com/codingiran/SwiftyCache.git", from: "1.0.0")
]

Then import where needed:

import SwiftyCache

🧩 Usage

Create a cache

let cache = SwiftyCache<String, Data>(
    totalCostLimit: 10_000,  // Optional
    countLimit: 100          // Optional
)

Store & retrieve values

func cacheAvatar(_ imageData: Data) async {
    await cache.setValue(imageData, forKey: "avatar", cost: imageData.count)

    let cachedData = await cache.value(forKey: "avatar")
}

Eviction

  • Least Recently Used items are automatically evicted when:

Update runtime configuration

await cache.setCountLimit(50)
await cache.setTotalCostLimit(5_000)
await cache.setClearOnMemoryPressure(false)
await cache.setName("avatars")

Remove items

await cache.removeValue(forKey: "avatar")
await cache.removeAllValues()

🧪 LRU Example

func lruExample() async {
    let cache = SwiftyCache<String, Int>(countLimit: 3)

    await cache.setValue(1, forKey: "A")
    await cache.setValue(2, forKey: "B")
    await cache.setValue(3, forKey: "C")

    _ = await cache.value(forKey: "A") // A is now most recently used

    await cache.setValue(4, forKey: "D") // B is evicted (least recently used)

    print(await cache.allKeys) // ["C", "A", "D"]
}

🧱 Implementation Highlights

  • Using Swift actor for thread safety
  • Implements NSCache-like API for easy integration
  • Built atop OrderedDictionary to avoid managing doubly-linked list manually
  • Reorders keys internally on access to preserve LRU order
  • Minimal dependencies, cleanly integrated with DispatchSourceMemoryPressure for memory warnings

📁 Project Structure

SwiftyCache/
├── Sources/
   └── SwiftyCache/
       ├── SwiftyCache.swift
       └── Resources/
           └── PrivacyInfo.xcprivacy
├── Tests/
   └── SwiftyCacheTests/
       └── SwiftyCacheTests.swift
├── Package.swift
├── Package@swift-5.10.swift
└── README.md  You are here

📄 License

This project is licensed under the MIT License.
See LICENSE for more information.


🤝 Contributing

Pull requests are welcome!
If you'd like to add a feature, fix a bug, or improve documentation:

  • Fork the repo
  • Create your feature branch: git checkout -b feature/your-feature
  • Commit your changes: git commit -m "Add some feature"
  • Push to the branch: git push origin feature/your-feature
  • Open a Pull Request

📬 Contact

Feel free to reach out:

📧 Email: codingiran@gmail.com
📦 GitHub: github.com/codingiran/SwiftyCache


Made with ❤️ by @codingiran

About

A lightweight, elegant, and performant in-memory cache written purely in Swift

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages