DIContainer
public typealias DependencyContainerClosure = (DIContainable) -> Any
public protocol DIContainable {
func register<T>(type: T.Type, containerClosure: @escaping DependencyContainerClosure)
func resolve<T>(type: T.Type) -> T?
}
DependencyContainerClosure
는 클로저 타입으로 (DIContainable) -> Any
형태해당 프로토콜을 채택한 DIContainer을 보면
public final class DIContainer: DIContainable {
public static let shared: DIContainer = DIContainer()
var services: [String: DependencyContainerClosure] = [:]
private init() {}
public func register<T>(type: T.Type, containerClosure: @escaping DependencyContainerClosure) {
services["\\(type)"] = containerClosure
}
public func resolve<T>(type: T.Type) -> T? {
let service = services["\\(type)"]?(self) as? T
if service == nil {
Logger.log(message: "\\(#file) - \\(#line): \\(#function) - \\(type) resolve error")
}
return service
}
}
resolve()
에서
let service = services["\\(type)"]?(self) as? T
이 분이 헷갈렸는데,
services["\\(type)"]?
로 옵셔널 체이닝을 사용한 이유: 딕셔너리값이 존재하지 않을 수도 있기 때문에services["\\(type)"]?(self)
그럼 (self)는 뭔가? : services["\\(type)"]?
는 클로저인데 그 글로저에 self를 넣어 호출한다는 의미!
as? T
Any가 반환되는데 옵셔널 캐스팅으로 T로 변환해주기 위함resolve()
는 원하는 객체를 뱉어주는 거라고 생각하자!