开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

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

评论

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

乘数科技云管控平台适配阿里云PolarDB,共促云原生数据库生态繁荣

阿里云数据库开源

数据库 阿里云 开源数据库 polarDB PolarDB for PostgreSQL

NFTScan 与 Port3 在 NFT 数据领域达成战略合作

NFT Research

C# 使用Timer和ProgressBar控件制作一个倒计时器

IC00

C# 7月月更

设计消息队列存储消息数据的 MySQL 表格

Fan

架构实战营

strcmp() - 比较字符串

謓泽

7月月更

长期的远程工作面临的几个问题和持续改进的组织自动化

Ryan Zheng

远程办公

怎样让全彩LED显示屏变的节能环保?

Dylan

LED显示屏 全彩LED显示屏

科创人·观远数据CEO苏春园:让业务用起来,是BI行业推倒渗透率之墙的关键

科创人

大数据

学界VS工业界:深度学习究竟能不能打破视频编解码天花板

小红书技术REDtech

深度学习 音视频 视频编解码 音视频技术

JS数组方法

bo

JavaScript 前端 7月月更

仅需一个依赖给Swagger换上新皮肤,既简单又炫酷

程序知音

数字化时代,如何利用区块链技术赋能乳制品企业?

旺链科技

区块链 产业区块链 乳制品

数仓基本概念解析

五分钟学大数据

数据仓库 7月月更

如何搭建一个好的知识库管理系统?

Geek_da0866

百度APP Android包体积优化实践(二)Dex行号优化

百度Geek说

Java Andriod

特斯拉为何使用.NET Core技术框架?

博文视点Broadview

Nacos配置中心之环境准备

急需上岸的小谢

7月月更

对话ACE第四期:分布式数据库未来发展的挑战和机遇

OceanBase 数据库

数据库 分布式数据库 oceanbase

企业进行知识管理有哪些好处?

Geek_da0866

数据库索引:索引并不是万能药

了不起的程序猿

MySQL 数据库 java程序员

执掌英国工程技术学会 13 载,范纳杰正式退休

E科讯

首发!这份字节大佬亲码算法面试大厂进阶宝典,让你轻松刷爆LeetCode!

了不起的程序猿

字节跳动 算法 java程序员

今日分享| 阿里巴巴内部最新Docker精髓笔记

冉然学Java

Java Docker 阿里 #技术干货# Java 开发

真人踩过的坑,告诉你避免自动化测试新手常犯的10个错误

禅道项目管理

自动化 测试 自动化测试

Linux 文件系统函数

贾献华

7月月更

【等保小知识】等保整改是什么意思?整改内容包括哪些?

行云管家

等保测评 等级测评 等保整改

2022亚洲国际物联网展会

AIOTE智博会

物联网展览会

SCA在得物DevSecOps平台上应用​

得物技术

安全 DevSecOps SCA

2022年数据库审计产品排行榜-必看!

行云管家

数据库 数据库审计

JAVA编程规范之异常处理

源字节1号

微信小程序 软件开发 前端开发 后端开发

前两天面了个腾讯拿 38K 出来的,让我见识到了基础的天花板,今天share给大家~

程序知音

Java 程序员 java面试 后端技术 八股文

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