写点什么

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:0017032

评论

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

日记 2021年2月18日(周四)

Changing Lin

2月春节不断更

心理声学基础

行者AI

心理 音乐

OAuth:每次授权暗中保护你的那个“MAN”

华为云开发者联盟

大前端 协议 权限 Oauth web服务

Java架构大牛之路必备“微服务架构笔记”

Java架构之路

Java 程序员 架构 面试 编程语言

阿里面试这样问:redis 为什么把简单的字符串设计成 SDS?

程序员小富

Java redis 面试

华为云FusionInsight MRS在金融行业存算分离的实践

华为云开发者联盟

大数据 金融 华为云 存算分离 FusionInsight MRS

技术实践 | 新思路!解决线上系统异常问题

百度开发者中心

程序员成长第九篇:真实项目中的注意事项

石云升

程序员 项目实战 2月春节不断更

进程管理:kill命令之-9与-15

程序员架构进阶

Java Linux 进程 七日更 2月春节不断更

话题讨论 | 如何使用“网站SEO”,让网站排在最前面?

我是哪吒

大前端 后端 话题讨论 SEO 2月春节不断更

阿里云大佬爆裂推荐“redis全新手册”,内容即精华

比伯

Java redis 程序员 架构 程序人生

2021新年最新分享:阿里Java岗5轮技术面经整理

比伯

Java 编程 架构 面试 程序人生

ElasticSearch.04 - 基础操作

insight

elasticsearch 2月春节不断更

区块链挖矿系统APP开发|区块链挖矿软件开发(现成)

v16629866266

山东党建系统!组织部智慧管理平台搭建

源中瑞-龙先生

智慧党建 组织部 山东

4.从legacy或concurrent开始(从入口开始,然后让我们奔向未来)

全栈潇晨

React React Hooks react源码

哲少荐书:鞋狗

Jackey

书籍推荐

如何 1 天快速集成自己的“Clubhouse”?

融云 RongCloud

音视频 clubhouse 语音社交 融云

14. Python 与数据库那点事儿,滚雪球学 Python

梦想橡皮擦

python 爬虫 2月春节不断更

探究Python源码,终于弄懂了字符串驻留技术

华为云开发者联盟

Python 字符串 Python解释器 字符串驻留 字符

厉害了!这群95后正在用三维成像技术让科幻变成现实

华为云开发者联盟

视频 华为云 三维 裸眼 光学

什么是阻抗?

不脱发的程序猿

阻抗 电路设计 电子元器件

Java中多线程启动,为什么调用的是start方法,而不是run方法?

Java 编程 架构

我用 go-zero 一周实现了一个中台系统,已开源!

万俊峰Kevin

微服务 go-zero Go 语言

28天写作再次开启,你准备好来挑战了吗?

TGO鲲鹏会

28天写作 热门活动

offer稳了!四面阿里面经分享,定级P6之路。

Java架构之路

Java 程序员 架构 面试 编程语言

新闻|2021 FOSDEM为期两天的活动成功举办,一大波学习资源来袭!

PostgreSQLChina

数据库 postgresql 软件 开源社区

LeetCode题解:63. 不同路径 II,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

话题讨论 | 今年,你回家过年了吗?

xcbeyond

话题讨论 春节 就地过年

【STM32】EXTI---外部中断/事件控制器

AXYZdong

硬件 stm32 2月春节不断更

大厂必问算法!查漏补缺LeetCode必考“1024道技术点面试题”

Java架构之路

Java 程序员 架构 面试 编程语言

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