Lightweight dependency injection framework


Build Status codebeat badge codecov Platforms

Injection is a tiny utility to help managing dependency injection.


  • Singleton, dependencies that are only instanciated once and are shared amongst its' users
  • Factory, dependencies that are instancied upon usage, unique to each user
  • Utility property wrappers


Swift Package Manager

If you're working directly in a Package, add Injection to your Package.swift file

dependencies: [
    .package(url: "", .upToNextMajor(from: "1.0.0" )),

If working in an Xcode project select File->Swift Packages->Add Package Dependency... and search for the package name: Injection or the git url:


  1. Define dependencies:
import Injection

// A dependency that gets created every time it needs to be resolved, and therefore its lifetime is bounded to the instance that uses it
let reader = factory { RSSReader() }

// A dependency that gets created only once, the first time it needs to be resolved and has the lifetime of the application.
let database = singleton { Realm() }

// Syntatic sugar to combine dependencies to inject
let cacheModule = module {
    singleton { ImageCache() }
    factory { AudioCache() }
    factory { VideoCache() }
  1. Inject the dependencies before the application is initialized:
import Injection

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        inject {
        return true
  1. Use the injected dependencies using the provided property wrappers:
import Injection

class VideoPlayer: BackendProtocol {
    // Will resolve the dependency immediately upon type instantiation
    @Inject var database: Database
    // The dependency only gets resolved on the first time the property gets accessed
    @LazyInject var videoCache: VideoCache
    // The functionality is similar to `LazyInject` except the property may or may not have been injected.
    @OptionalInject var network: Network?

or via the initializer:

import Injection

struct Reader {
    private let rssReader: RSSReader
    init(rssReader: RSSReader = resolve()) {
        self.rssReader = rssReader


If you feel like something is missing or you want to add any new functionality, please open an issue requesting it and/or submit a pull request with passing tests 🙌




João (@_JARMourato)


  • Swift Tools 5.3.0
View More Packages from this Author


  • None
Last updated: Wed Nov 09 2022 04:41:40 GMT-0500 (GMT-05:00)