Skip to content

Instantly share code, notes, and snippets.

func testFeature2() {
let dependencies: Feature2.Dependencies = AnyInitializer(Feature2.Dependencies.init).resolve(by: container)
let f2 = Feature2(dependencies: dependencies)
f2.doSomething()
}
output:
Test Case '-[DITests.DITests testFeature2]' started.
import FeatureService
extension Feature1: Feature1Service {
public func doSomething() {
print("Feature1 do something")
}
}
import Foundation
import FeatureService
public class Feature2 {
public struct Dependencies {
let feature1: Feature1Service
let feature3: Feature3Service
public init(feature1: Feature1Service, feature3: Feature3Service) {
self.feature1 = feature1
class AppContext {
let container: DIContainer
init() {
self.container = DIContainer.init()
ServiceAssembly.assembled(in: container)
}
}
import Foundation
import Swinject
public typealias DIContainer = Container
public final class AnyInitializer {
private let resolve:(_ container: DIContainer) -> Any
public init<D1, D2, T>(_ function: @escaping (D1, D2) -> T) {
resolve = { container in
let d1: D1 = container.resolve(D1.self)!
class LoginViewController {
private let userSession: UserSession
init(_ userSession: UserSession = UserSession()) {
self.userSession = userSession
}
}
let vc = LoginViewController()
let vc = LoginViewController(userSession)
protocol Service {}
Class ServiceLocator {
func register(_ service: Service, for type: ServiceType)
func resolve(_ type: ServiceType)
}
ServiceLocator.shared.register(UserSession(), type: UserService.self)
Struct UserService: Service {}
Class UserSession {
static let shared: UserSession
}
Class LoginViewController {
func login(_ name: String, password: String) {
...
UserSession.shared.login(name, password)
...
typealias Login = (_ name: String, _ password: String) -> Void
class LoginViewController {
func login(_ login: Login, name: String, password: String) {
...
login(name, password)
...
}
}
class LoginViewController {
var userSession: UserSession?
func login(_ userName: String, password: String) {
userSesson?.login(userName, password)
}
}