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

问小白

问小白是一个基于 DeepSeek R1 模型的智能对话平台,专为用户提供高效、贴心的对话体验。实时在线,支持深度思考和联网搜索。免费不限次数,帮用户写作、创作、分析和规划,各种任务随时完成!

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

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

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

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

Project Cover

Trae

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

Project Cover

AIWritePaper论文写作

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

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