DITranquillity 4.6.0

DITranquillity 4.6.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2024年5月
SPM支持 SPM

Ivlev Alexander 维护。



  • 作者:
  • Alexander.Ivlev

Tranquillity

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]