This is a simple Swift IOC container implementation. The entire implementation is
contained (no pun intended) in a single
Contents.swift
file for quick copy-and-paste into your project.
- Simple API. Minimal concepts.
- Tiny file. Minimal code (less than 100 LOC w/o docs).
- One file drop-in. You don't even need any dependency manager.
- Immutable containers. Construct new ones by
+
-ing existing ones. - Can be used to make hierarchical container trees.
Register dependencies with either a singleton
or a factory
resolver:
// Registers a singleton object.
let resolver = singleton({ _ in GlobalServiceObject() })
// Registers a factory function.
let resolver = factory({ (resolver) -> ComplexObject in
let co = ComplexObject()
co.innerDependency = <-resolver
co.invokeMethod()
return co
})
// Registers a factory function using Swift shorthand lambda form
let resolver = factory({ Dependent(dependency: <-$0) })
Construct your container by merging Resolver
s together using the plus (+
) operator:
let container = singleton({ _ in ServiceOne() }) +
singleton({ _ in ServiceTwo() }) +
factory({ _ in InstanceService() })
// or mutable
var container = emptyContainer()
container += singleton({ _ in ServiceOne() })
container += singleton({ _ in ServiceTwo() })
//...
Then to obtain dependencies, pull it out from the container you have just created using
the reverse arrow (<-
) operator:
import UIKit
class MyViewController: ViewController {
let serviceObject: GlobalServiceObject = <-container
let anotherService: InstanceService = <-container
override func viewDidLoad() {
super.viewDidLoad()
serviceObject.use()
}
}
Additionally, dependencies can be lazy:
class X {
lazy var cash: ExpensiveObject = <-container
func doWork() {
cash.work()
}
}
Or hierarchical:
import UIKit
let topLevel = singleton({ _ in ServiceObject() })
class RootViewController: ViewController {
let container = topLevel + singleton({ _ in ViewUtility() })
// ...
}
Or registered out-of-order:
var container = emptyContainer()
container += factory({ One(requireTwo: <-$0 })
container += factory({ Two(requireThree: <-$0 })
container += factory({ Three() })
Enjoy!
- Handles superclass types.
- Overrides.
- Modules system.
- Cyclic check.
GitHub issue or ping me @chakrit on twitter.
MIT