Skip to content

Instantly share code, notes, and snippets.

@fromkk
Last active July 9, 2019 22:49
Show Gist options
  • Save fromkk/ce9e92f6b1419bf21078208ba70545a5 to your computer and use it in GitHub Desktop.
Save fromkk/ce9e92f6b1419bf21078208ba70545a5 to your computer and use it in GitHub Desktop.
Simplest DI container in Swift
public class DIContainer {
public typealias Resolver = ([Any]) -> Any?
static var resolvers: [ObjectIdentifier: Resolver] = [:]
public static func register<T>(_ type: T.Type, resolver: @escaping Resolver) {
resolvers[ObjectIdentifier(type)] = resolver
}
public static func resolve<T>(_ type: T.Type, args: Any...) -> T? {
guard let resolver = resolvers[ObjectIdentifier(type)] else { return nil }
return resolver(args) as? T
}
}
@fromkk
Copy link
Author

fromkk commented May 12, 2018

Usage

protocol Valuable {
    var value: String { get }
}

struct Value: Valuable {
    var value: String
}

DIContainer.register(Valuable.self) { args in
    guard let text = args.first as? String else { return nil }
    return Value(value: text)
}

let value = DIContainer.resolve(Valuable.self, args: "test") // Optional(Value(value: “test”))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment