Project Icon

swift-dependencies

SwiftUI风格的依赖管理库,优化测试和开发流程

这是一个受SwiftUI启发的依赖管理库,帮助开发者有效控制和管理与外部系统的交互。用户可以轻松注册和使用可控的依赖,优化测试和开发流程,并在Xcode预览和单元测试中灵活切换依赖实现。非常适合需要提升代码可测试性和维护性的Swift项目。

项目介绍:swift-dependencies

概述

swift-dependencies 是一个受到 SwiftUI 中“环境”启发的依赖管理库。它旨在帮助开发者更好地控制应用程序中需与外部系统交互的类型和函数。常见的依赖实例包括 API 客户端、UUID、Date 初始化器、文件访问、用户默认设置,甚至时钟和计时器等。

在应用开发中,依赖管理(或“依赖注入”)通常不被过多考虑,但不受控的依赖会导致代码库和开发周期中的许多问题。通过库,开发者可以更好地控制这些依赖,解决以下问题:

  • 编写快速、确定性测试的难度。
  • 无法在 SwiftUI 预览中良好运作的依赖。
  • 过于臃肿的第三方库依赖往往导致较长的编译时间。

swift-dependencies 帮助开发者以更舒适的方式将依赖传播至整个应用,并在确保安全的情况下随时重写这些依赖,特别是在测试、SwiftUI 预览以及用户引导程序中。

快速入门

这个库允许开发者注册自己的依赖类型,并提供了可控的依赖,帮助开发者更轻松地管理任务、日期、UUID 等。示例如下:

@Observable
final class FeatureModel {
  var items: [Item] = []

  @ObservationIgnored
  @Dependency(\.continuousClock) var clock  // 可控的任务休眠方式
  @ObservationIgnored
  @Dependency(\.date.now) var now           // 可控的当前日期获取方式
  @ObservationIgnored
  @Dependency(\.mainQueue) var mainQueue    // 可控的主线程调度
  @ObservationIgnored
  @Dependency(\.uuid) var uuid              // 可控的 UUID 创建

  // ...
}

在定义了依赖后,开发者可以通过模型操作依赖,而不是直接使用 Date()UUID() 等:

@Observable
final class FeatureModel {
  // ...

  func addButtonTapped() async throws {
    try await clock.sleep(for: .seconds(1))  //  🤚 不使用 'Task.sleep'
    items.append(
      Item(
        id: uuid(),  // 🤚 不使用 'UUID()'
        name: "",
        createdAt: now  // 🤚 不使用 'Date()'
      )
    )
  }
}

项目示例和安装

通过这个库,我们重构了苹果的 Scrumdinger 演示应用,使用了现代 SwiftUI 开发的最佳实践。这展示了如何使用这个库控制文件系统访问、计时器和语音识别 API 的依赖。

要在 Xcode 项目中加入 Dependencies,可以将其作为包引入项目:

dependencies: [
  .package(url: "https://github.com/pointfreeco/swift-dependencies", from: "1.0.0")
]

并在需要的目标中添加产品:

.product(name: "Dependencies", package: "swift-dependencies"),

社区与扩展

如果你希望讨论这个库或有使用问题,可以加入 Point-Free 社区。库也支持拓展,以下项目基于 Dependencies 开发:

  • Dependencies Additions:提供更高层次的依赖管理。
  • Dependencies Protocol Extras:使 swift-dependencies 在使用协议时更为强大。

许可证

swift-dependencies 在 MIT 许可证下发布。该库不仅提供了一种全面的依赖管理方式,还具备扩展性强,可以在众多项目中应用。它解决了开发过程中常见的依赖问题,使得应用的依赖管理更为灵活和高效。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号