Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save joshuajhomann/29a11546a5c39ee8bc0492f928d619b4 to your computer and use it in GitHub Desktop.
Save joshuajhomann/29a11546a5c39ee8bc0492f928d619b4 to your computer and use it in GitHub Desktop.
Dependency Injection by Protocol Extension
import UIKit
import PlaygroundSupport
//MARK: Networking
protocol NetworkServiceProtocol {
func test()
}
struct NetworkService: NetworkServiceProtocol {
func test() {
print("Regular test")
}
}
struct MockNetworkService: NetworkServiceProtocol {
func test() {
print("Mock test")
}
}
//MARK: Dependencies
struct Dependencies {
let networkService: NetworkServiceProtocol
}
extension Dependencies {
#if false
static let shared = Dependencies()
private init() {
networkService = NetworkService()
}
#else
static var shared = Dependencies()
private init() {
networkService = MockNetworkService()
}
static func make(
networkService: NetworkServiceProtocol = MockNetworkService()
) -> Dependencies {
return Dependencies(
networkService: networkService
)
}
#endif
}
//MARK: Injection Protocols
protocol NetworkServiceInjected {
var networkService: NetworkServiceProtocol { get }
}
extension NetworkServiceInjected {
var networkService: NetworkServiceProtocol {
return Dependencies.shared.networkService
}
}
//MARK: Instance
class V: UIViewController, NetworkServiceInjected { }
let v = V()
v.networkService.test()
Dependencies.shared = Dependencies.make(
networkService: NetworkService()
)
v.networkService.test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment