SwiftDI
Swift 项目使用的简单依赖注入库。
示例
组装依赖项
基本上,SwiftDI 以服务定位器模式的方式工作。它将所有依赖项存储在自身的列表中。但是,可以将 Injector
容易地拆分成子模块以减少代码链接。
// Swift
let injector = Injector()
injector.bind(ApiProtocol.self)
.with { return RestApi() }
injector.bind(RepositoryProtocol.self)
.with { (api: ApiProtocol) -> RepositoryProtocol.self in
return Repository(api: api)
}
// or you can bind Repository constructor directly
injector.bind(RepositoryProtocol.self)
.with(Repository.init(api:))
直接将依赖项注入到 ViewController 中
// Swift
class Controller: UIViewController {
var injector: Injector! = ... // provide injector to VC
var repository: RepositoryProtocol!
func viewDidLoad() {
super.viewDidLoad()
repository = injector.resolve()
}
}
依赖注入选项
// Swift
injector.bind(ApiProtocol.self) // link with type
.tag("some tag") // link with custom string tag
.scope(.singleton) // define dependency as singleton
.with { ... } // initilization dependency closure
injector.resolve(ApiProtocol.self, tag: "some value") //resolving by type and tag
子模块
Injector
支持模块化,并可以具有隔离的子模块,这些子模块了解父模块但不了解兄弟模块。
// Top level module
let injector = Injector()
injector.bind(RepositoryProtocol.self)
.with { injector -> RepositoryProtocol.self in
return Repository()
}
// Screen module
let childInjector = injector.plus()
childInjector.bind(PresenterProtocol.self)
.with { injector -> PresenterProtocol in
return Presenter(repository: injector.resolve())
}
CocoaPods
CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器。为了设置,您需要访问他们的网站。一旦您为 CocoaPods 设置了项目,您可以在您的 Podfile
中指定 SwiftDI
依赖关系。
pod 'SwiftDI', '~> 2.0'
Swift 包管理器
Swift 包管理器 是一个用于管理 Swift 代码分发的工具。它与 Swift 构建系统集成以自动化下载、编译和链接依赖项的过程。
一旦您设置了 Swift 包,将 SwiftDI
添加为依赖项就像将其添加到 Package.swift
的依赖项值一样简单。
Swift 5
dependencies: [
.package(url: "https://github.com/achernoprudov/SwiftDI.git", from: "2.0.0")
]