50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

Swift 可组合架构为 iOS 应用开发带来 Redux 模型

作者:Sergio De Simone

  • 2024-09-30
    北京
  • 本文字数:1402 字

    阅读完需:约 5 分钟

Swift 可组合架构为 iOS 应用开发带来Redux模型

可组合架构(TCA,最近发布了 1.13 版本)是一个“符合人体工程学”的 Swift 库。它提供了一个通用框架用于解决构建应用程序时经常遇到的问题,包括状态管理、特性组合、副作用管理和测试。


可组合架构基于几个关键的概念,包括 state(状态)、action(动作)、reducer 和 store(存储)。Reducer 和 store 这两个概念,使用 Redux 的 React 程序员应该都熟悉,但对于原生 iOS 开发来说,它们却是两个非常新颖的设计。按照库的创建者 Brandon Williams 和 Stephen Celis 的说法,这种方法可以将大而复杂的特性分解成多个更小的部分然后组合在一起。


据库的创建者介绍,虽然可组合架构可以与 UIKit 和 Swift 一起使用,但它的设计很大程度上是受了 SwiftUI 的启发,并且对它是个很好的补充。因此,对于熟悉 SwiftUI 及其模式的开发人员来说,这个库特别符合人体工程学。


特别地,TCA 提供了一个@ObservableState宏,它的工作方式类似于 iOS 16 的@Observable,并且可以像 SwiftUI 一样检测任何的状态变化。TCA 还借用了 SwiftUI 的方法来实现可组合性,其中每个特性都是一个提供body属性的类型,并且会模拟 SwiftUI @Environment属性封装器的行为,进而使用@Dependency属性封装器来处理依赖规范。


下面的代码片段展示了如何为一个简单的加减计数器特性建模:


@Reducerstruct Feature {    @ObservableState    struct State: Equatable {        var count = 0        var numberFact: String?    }    enum Action {        case decrementButtonTapped        case incrementButtonTapped        case numberFactButtonTapped        case numberFactResponse(String)    }

var body: some Reducer<State, Action> { Reduce { state, action in switch action { // 在这里实现所有的动作; // 它们会修改状态或产生副作用 } } }}
复制代码


如上所示,App 的状态和供用户使用的动作都是使用特定的类型进行建模的,而body方法负责更新每个动作的状态。


TCA 的一个关键方面是状态共享,它是通过宏@Shared实现的。可以看到,它的工作原理类似于 SwiftUI @Binding,公开一个publisher属性,使其可以检测应用程序任何部分对引用做的更改。@Shared属性封装器还支持将数据持久化到内存、用户默认设置、通用文件或使用自定义机制。


在很大程度上,TCA 依赖于 SwiftUI 中常用的 UI 元素,比如sheet(item:)popover(item:)NavigationStack,但它自己也提供了更适合于状态驱动应用的导航机制。该库主要支持两种导航模式:基于树的导航和基于栈的导航。


库的作者承认,采用一个库作为应用程序架构的基础可能是一个相当具有挑战性的决定,但在某些情况下,那可能是最好的方法,而不是试图从头开始重新实现所有内容:


如果一个库的核心原则与你构建应用程序时优先考虑的事项一致,那么采用这个库可能就是一个明智的选择。最好是将一组定义良好的工具与连贯的维护历史和强大的社区结合在一起,而不是将分散在互联网博文中的许多“建议和技巧”粘合在一起。


Swift 可组合架构可以 从 GitHub 克隆或从 Swift Package Index 安装。它在 GitHub 上拥有超过 12000 颗星和 1400 个分支,以及 200 多位贡献者,这使它成为 Swift Package Index 上最受欢迎的 Swift 架构库。


原文链接:

https://www.infoq.com/news/2024/08/swift-composable-architecture/

2024-09-30 08:0016976

评论

发布
暂无评论
发现更多内容

天上掉下个“星纪元ET”!首次挑战空中坠落试验高调秀肌肉

极客天地

理论+实践,带你了解分布式训练

华为云开发者联盟

机器学习 华为云 华为云开发者联盟 大语言模型 企业号2024年5月PK榜

程序员离不开的10款开发软件(必备)

伤感汤姆布利柏

当「软件研发」遇上 AI 大模型

阿里云云效

阿里云 云原生 通义灵码

高情商程序员:5种类型的bug沟通有诀窍!

糖小妹来了

bug bug修复 bug管理 bug报告

锁定“场景”,告别“需求不明确”

糖小妹来了

需求 场景 场景化 场景化思维 需求澄清

Apache RocketMQ ACL 2.0 全新升级

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

安全是最大的豪华!星纪元ET成功挑战31.9米空中坠落试验

极客天地

掌握高阶定位技巧:Xpath神功解析!

测吧(北京)科技有限公司

测试

一键自动化博客发布工具,用过的人都说好(oschina篇)

不在线第一只蜗牛

运维 自动化

需求做不完?7种“问句”用了没?

糖小妹来了

需求 需求排序 需求变更 需求澄清 需求评审

AIGC时代IT人的迷茫有解(1):从“商业画布”到“个人画布”

糖小妹来了

职业规划 商业画布 个人画布

AIGC时代IT人的迷茫有解(3):从“用户画像”到“个人职业画像”

糖小妹来了

职业规划 用户画像 #职业发展

2024-05-08:用go语言,给定一个由正整数组成的数组 nums, 找出数组中频率最高的元素, 然后计算该元素在数组中出现的总次数。 输入:nums = [1,2,2,3,1,4]。 输出:4。

福大大架构师每日一题

福大大架构师每日一题

新一代智慧音视频平台,企业必备新基建

中关村科金

音视频 企业服务 大模型

当「软件研发」遇上 AI 大模型

阿里巴巴云原生

阿里云 云原生 通义灵码

AIGC时代IT人的迷茫有解(2):从“产品规划十步法”到“职业规划十步法”

糖小妹来了

职业规划 产品规划

锁定“用户人群”,远离“ 需求取舍难”

糖小妹来了

需求 用户 用户画像 需求澄清 需求评审

将“安全”进行到底!星纪元ET挑战TOP Safety空中坠落试验现场大公开

极客天地

星纪元ET首次上演空中“自由落体”,极致安全实力无惧硬核极限挑战

极客天地

你的拖延,该不会是“约拿情结”吧?程序员的5个时间管理技巧

糖小妹来了

时间管理 拖延症

芯盾时代IAM,三种权限管理模型按需选择

芯盾时代

权限管理 iam 统一身份认证 统一身份管理平台 最小权限管理

从代码到洞察:使用API接口深入分析商品详情数据

Noah

Swift 可组合架构为 iOS 应用开发带来Redux模型_后端_InfoQ精选文章