Skip to content

Instantly share code, notes, and snippets.

@chakrit
Last active August 29, 2015 14:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save chakrit/019bc39591751beaf4cf to your computer and use it in GitHub Desktop.
Save chakrit/019bc39591751beaf4cf to your computer and use it in GitHub Desktop.
class Container {
typealias Resolver = () -> AnyObject
private var _resolvers: [String: Resolver] = [:]
func register<T: AnyObject>(resolver: @autoclosure () -> T) {
let name = NSStringFromClass(T.self)
_resolvers[name] = resolver
}
func get<T: AnyObject>() -> T {
let name = NSStringFromClass(T.self)
if let resolver = _resolvers[name] {
return resolver() as T
} else {
fatalError("no registration for requested type")
}
}
}
prefix operator <- {}
infix operator <- {}
prefix func <-<T: AnyObject>(container: Container) -> T {
return container.get()
}
func <-<T: AnyObject>(container: Container, registration: @autoclosure () -> T) {
container.register(registration)
}
class A: NSObject { }
class B: NSObject { }
let a = A()
let b = B()
let container = Container()
container <- a // singleton
container <- B() // factory
class Dependent {
let a: A = <-container
let b: B = <-container
}
let dep = Dependent()
if dep.a == a { print("a ok") }
if dep.b != b { print("b ok") }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment