SwiftDI 2.0.1

SwiftDI 2.0.1

Andrey Chernoprudov 维护。



SwiftDI 2.0.1

  • 编者:
  • Andrey Chernoprudov

SwiftDI

Travis CI CocoaPods Version License Platforms Swift Version Swift Package Manager compatible

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")
]