DITranquillity
Tranquillity 是一个轻量但强大的 Swift 依赖注入库。
“Tranquillity” 这个名字在库的基本原则上奠定了基础:清晰、简洁和安全。
它表示 - 使用这个库,您的依赖将变得平静。
关于依赖注入
依赖注入是一种软件开发模式,其中某人将依赖项交给一个对象。
它是更广泛技术方法 控制反转 的一种形式,有助于实现 依赖倒置原则
我还建议您阅读术语表,这将帮助您更好地理解这些术语。
特性
核心
用户界面
图形API
安装
库支持三个流行的包管理器:Cocoapods、Carthage、SwiftPM。
CocoaPods
在您的Podfile
中添加以下行:
pod 'DITranquillity'
SwiftPM
您可以使用“Xcode/文件/Swift 包/添加包依赖…”并写入github网址
https://github.com/ivlevAstef/DITranquillity
还可以编辑您的Package.swift
文件,并将以下行添加到dependencies
部分:
.package(url: "https://github.com/ivlevAstef/DITranquillity.git", from: "4.4.0")
别忘了在target
部分指定依赖项行
.product(name: "DITranquillity")
注意!- SwiftPM不支持“UI”部分的特性。
Carthage
将以下行添加到您的Cartfile
中:
github "ivlevAstef/DITranquillity"
Carthage支持"UI"和"GraphAPI"部分,无需额外的操作。
使用方法
此库使用声明式依赖描述风格,允许您将应用程序代码与依赖描述代码分离。
为了快速入门,让我们看看一个简化版VIPER屏幕的代码示例
.................................................
/// Dependency description
let container = DIContainer()
container.register(LoginRouter.init)
container.register(LoginPresenterImpl.init)
.as(LoginPresenter.self)
.lifetime(.objectGraph)
container.register(LoginViewController.init)
.injection(cycle: true, \.presenter)
.as(LoginView.self)
.lifetime(.objectGraph)
container.register(AuthInteractorImpl.init)
.as(AuthInteractor.self)
.................................................
/// Application start point
let router: LoginRouter = container.resolve()
window.rootViewController = router.rootViewController
router.start()
.................................................
/// Application Code
import SwiftLazy
class LoginRouter {
let rootViewController = UINavigationController()
private let loginPresenterProvider: Provider<LoginPresenter>
init(loginPresenterProvider: Provider<LoginPresenter>) {
loginPresenterProvider = loginPresenterProvider
}
func start() {
let presenter = loginPresenterProvider.value
presenter.loginSuccessCallback = { [weak self] _ in
...
}
// Your can write code without force cast, it's code simple example
rootViewController.push(presenter.view as! UIViewController)
}
}
protocol LoginPresenter: class {
var loginSuccessCallback: ((_ userId: String) -> Void)?
func login(name: String, password: String)
}
protocol LoginView: class {
func showError(text: String)
}
class LoginPresenterImpl: LoginPresenter {
private weak var view: LoginView?
private let authInteractor: AuthInteractor
init(view: LoginView, authInteractor: AuthInteractor) {
self.view = view
self.authInteractor = authInteractor
}
func login(name: String, password: String) {
if name.isEmpty || password.isEmpty {
view?.showError(text: "fill input")
return
}
authInteractor.login(name: name, password: password, completion: { [weak self] result in
switch result {
case .failure(let error):
self?.view?.showError(text: "\(error)")
case .success(let userId):
self?.loginSuccessCallback?(userId)
}
})
}
}
class LoginViewController: UIViewController, LoginView {
var presenter: LoginPresenter!
...
func showError(text: String) {
showAlert(title: "Error", message: text)
}
private func tapOnLoginButton() {
presenter.login(name: nameTextField.text ?? "", password: passwordTextField.text ?? "")
}
}
protocol AuthInteractor: class {
func login(name: String, password: String, completion: (Result<String, Error>) -> Void)
}
class AuthInteractorImpl: AuthInteractor {
func login(name: String, password: String, completion: (Result<String, Error>) -> Void) {
...
}
}
如您所见,依赖描述代码只占一小部分,应用程序代码不会了解依赖的实现细节。
此外,您还可以查看示例
您还可以阅读文章
需求
iOS 11.0+,macOS 10.13+,tvOS 11.0+,watchOS 4.0+,Linux;ARC
- Swift 5.5-5.8:Xcode 13,14;版本 >= 3.6.3
- Swift 5.0-5.3:Xcode 10.2-12.x;版本 >= 3.6.3
- Swift 4.2:Xcode 10;版本 >= 3.4.3
- Swift 4.1:Xcode 9.3;版本 >= 3.2.3
- Swift 4.0:Xcode 9.0;版本 >= 3.0.5
- Swift 3.0-3.2:Xcode 8.0-9.0;0.9.5 <= 版本 < 3.7.0
- Swift 2.3:Xcode 7.0;版本 < 0.9.5
更新日志
历史与计划
- v1.x.x - 开始
- v2.x.x - 稳定
- v3.x.x - 进化和功能
- v4.x.x - 图形API和优化。还有文档和营销
- v5.x.x - 预编译时验证
反馈
我发现了一个错误或者有功能建议
请提交一个GitHub问题。
我发现文档中存在缺陷,或者想到了可以改进的方法
请帮助库的开发,创建拉取请求
请求
如果你喜欢我的库,那么请通过给它加星支持库。
有问题吗?
您可以在邮箱中自由提问:[email protected]。