一个轻量级的依赖注入库,用于 Swift 和 SwiftUI 项目。
Inject 支持 Swift Package Manager。
要使用 Swift Package Manager 安装 Inject,您可以按照 Apple 发布的教程,使用 Inject 仓库的 URL 和当前版本
或者您可以将以下依赖项添加到您的 Package.swift
.package(url: "https://github.com/rmichelberger/Inject/", from: "1.0.0")
您需要在项目中为每个依赖项定义提供程序。
@Provides
的签名
@Provides var dependency: () -> Dependency = { Dependency() }
每次注入依赖项时,都会调用提供程序函数。
@Singleton
的签名
@Singleton var signleton: Singleton = Singleton()
单例的实例会被存储,并且每次注入时都会提供这个实例。
示例
@Singleton var repository: Repository = RepositoryImpl()
定义项目依赖项的示例
func Dependencies() {
@Provides var apiService = { ApiService() }
@Provides var retroSwift = {
let logger = SimpleLogger()
let client = OkHttpClient(logger: logger)
return RetroSwift(client: client)
}
@Provides var useCase = { UseCase() }
// ViewModels
@Provides var artListViewModel = { ArtListViewModel() }
@Provides var artDetailViewModel = { ArtDetailViewModel() }
// Singletons
@Singleton var repository: Repository = RepositoryImpl()
}
不要忘记在应用程序启动时初始化依赖项
@main
struct MyApp: App {
init() {
Dependencies()
}
要注入依赖项,请使用 @Inject
@Inject private var dependency: Dependency
示例
final class RepositoryImpl: Repository {
@Inject private var apiService: ApiService
func getArtList() async throws -> [ArtData] {
try await apiService.getArtList().data
}
func getArtDetail(id: Int) async throws -> ArtDetailData {
try await apiService.getArtDetail(id: id).data
}
}
对于单例依赖项,请使用 @Singleton
@Singleton private var repository: Repository
视图模型可以通过 ViewModel()
注入
@StateObject private var viewModel: ArtListViewModel = ViewModel()
定义 | Inject | 作用域 |
---|---|---|
@Provide |
@Inject |
生命周期在提供程序函数中定义 |
@Singleton |
@Singleton |
应用程序生命周期 |
我们始终欢迎来自社区的贡献。请确保您的更改包含单元测试。
灵感来源于 hilt。